Given a string s. In one step you can insert any character at any index of the string.
Return the minimum number of steps to make s palindrome.
A Palindrome String is one that reads the same backward as well as forward.
Example 1:
Input: s = “zzazz”
Output: 0
Explanation: The string “zzazz” is already palindrome we don’t need any insertions.
Example 2:
Input: s = “mbadm”
Output: 2
Explanation: String can be “mbdadbm” or “mdbabdm”.
Example 3:
Input: s = “leetcode”
Output: 5
Explanation: Inserting 5 characters the string becomes “leetcodocteel”.
Constraints:
- 1 <= s.length <= 500
- s consists of lowercase English letters.
看其他朋友的答案,受益良多。
use std::collections::HashMap;
impl Solution {
fn dp(chars: &Vec<char>, i: usize, j: usize, cache: &mut HashMap<(usize, usize), i32>) -> i32 {
if i >= j {
return 0;
}
if chars[i] == chars[j] {
let next = if let Some(c) = cache.get(&(i + 1, j - 1)) {
*c
} else {
Solution::dp(chars, i + 1, j - 1, cache)
};
cache.insert((i, j), next);
return next;
}
let left = if let Some(c) = cache.get(&(i + 1, j)) {
*c
} else {
Solution::dp(chars, i + 1, j, cache)
};
let right = if let Some(c) = cache.get(&(i, j - 1)) {
*c
} else {
Solution::dp(chars, i, j - 1, cache)
};
let ans = left.min(right) + 1;
cache.insert((i, j), ans);
ans
}
pub fn min_insertions(s: String) -> i32 {
Solution::dp(&s.chars().collect(), 0, s.len() - 1, &mut HashMap::new())
}
}