1930. 长度为 3 的不同回文子序列

This commit is contained in:
li-chx 2025-11-21 09:34:48 +08:00
parent 67d79e3553
commit 4b8594e8e3
1 changed files with 26 additions and 22 deletions

View File

@ -1,34 +1,38 @@
mod arr; use std::collections::HashSet;
struct Solution; struct Solution;
impl Solution { impl Solution {
pub fn intersection_size_two(intervals: Vec<Vec<i32>>) -> i32 { pub fn count_palindromic_subsequence(s: String) -> i32 {
let mut tasks = intervals; let mut ans = 0;
tasks.sort_by_key(|task| task[1]); let s = s.bytes().collect::<Vec<u8>>();
let mut stack:Vec<Vec<i32>> = Vec::new(); let mut set : HashSet<u8> = HashSet::new();
stack.push(vec![-2,-2,0]); for c in b'a'..=b'z' {
for task in tasks.iter() { set.clear();
let start = task[0]; let (mut start,mut end) = (-1,0);
let end = task[1]; for i in 0..s.len() {
let mut d = 2; if s[i] == c {
let pos = stack.partition_point(|x| x[0] < start) - 1; start = i as i32;
d -= stack[stack.len() - 1][2] - stack[pos][2]; break;
if start <= stack[pos][1] { }
d -= stack[pos][1] - start + 1;
} }
if d <= 0{ if start == -1 {
continue; continue;
} }
while end - stack[stack.len() - 1][1] <= d { for i in (0..s.len()).rev() {
let end = stack.pop().unwrap(); if s[i] == c {
d += end[1] - end[0] + 1; end = i;
break;
}
} }
stack.push(vec![end - d + 1, end,stack[stack.len() - 1][2] + d]); for i in (start+1)as usize..end {
set.insert(s[i]);
}
ans += set.len() as i32;
} }
stack[stack.len() - 1][2] ans
} }
} }
fn main() { fn main() {
let result = Solution::intersection_size_two(arr::make_matrix("[[1,3],[3,7],[8,9]]")); let result = Solution::count_palindromic_subsequence(String::from("bbcbaba"));
println!("{:?}", result); println!("{:?}", result);
} }