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;
impl Solution {
pub fn intersection_size_two(intervals: Vec<Vec<i32>>) -> i32 {
let mut tasks = intervals;
tasks.sort_by_key(|task| task[1]);
let mut stack:Vec<Vec<i32>> = Vec::new();
stack.push(vec![-2,-2,0]);
for task in tasks.iter() {
let start = task[0];
let end = task[1];
let mut d = 2;
let pos = stack.partition_point(|x| x[0] < start) - 1;
d -= stack[stack.len() - 1][2] - stack[pos][2];
if start <= stack[pos][1] {
d -= stack[pos][1] - start + 1;
pub fn count_palindromic_subsequence(s: String) -> i32 {
let mut ans = 0;
let s = s.bytes().collect::<Vec<u8>>();
let mut set : HashSet<u8> = HashSet::new();
for c in b'a'..=b'z' {
set.clear();
let (mut start,mut end) = (-1,0);
for i in 0..s.len() {
if s[i] == c {
start = i as i32;
break;
}
if d <= 0{
}
if start == -1 {
continue;
}
while end - stack[stack.len() - 1][1] <= d {
let end = stack.pop().unwrap();
d += end[1] - end[0] + 1;
}
stack.push(vec![end - d + 1, end,stack[stack.len() - 1][2] + d]);
}
stack[stack.len() - 1][2]
for i in (0..s.len()).rev() {
if s[i] == c {
end = i;
break;
}
}
for i in (start+1)as usize..end {
set.insert(s[i]);
}
ans += set.len() as i32;
}
ans
}
}
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);
}