use std::cmp; struct Solution {} impl Solution { pub fn longest_palindrome_subseq(s: String) -> i32 { let mut longest: Vec> = vec![]; longest.resize_with(s.len(), || { let mut nested: Vec = vec![]; nested.resize(s.len(), 0); nested }); for i in (0..s.len()).rev() { longest[i][i] = 1; for j in i + 1..s.len() { if s.as_bytes()[i] == s.as_bytes()[j] { longest[i][j] = 2 + longest[i + 1][j - 1]; } else { longest[i][j] = cmp::max(longest[i + 1][j], longest[i][j - 1]); } } } longest[0][s.len() - 1] } } fn main() {} #[cfg(test)] mod tests { use super::*; #[test] fn with_skip() { assert_eq!(Solution::longest_palindrome_subseq("bbbab".to_owned()), 4); } #[test] fn without_skip() { assert_eq!(Solution::longest_palindrome_subseq("cbbd".to_owned()), 2); } }