LeetCode每日一题(Palindrome Partitioning II)

Given a string s, partition s such that every substring of the partition is a palindrome.

Return the minimum cuts needed for a palindrome partitioning of s.

Example 1:

Input: s = “aab”
Output: 1

Explanation:
The palindrome partitioning [“aa”,“b”] could be produced using 1 cut.

Example 2:

Input: s = “a”
Output: 0

Example 3:

Input: s = “ab”
Output: 1

Constraints:

  • 1 <= s.length <= 2000
  • s consists of lower-case English letters only.

既然让咱们 cut 那咱们就 cut 呗,从左向右找下刀的点,只要保证切下来左半部分是回文就可以下刀,又半部分递归调用 cut, 继续这个过程,整个过程没有切错了这一说,因为最坏的情况是你把每个字母都单独切出来,这也算是回文,只是刀数是最大的。这里面要考虑一个边界情况就是一刀不切人家就是回文的情况,这种情况直接返回 0 就可以了,因为这已经是最好的情况了。


代码(Rust):

use std::collections::HashMap;

impl Solution {
    fn is_palindrome(chars: &[char]) -> bool {
        let mut i = 0 as i32;
        let mut j = chars.len() as i32 - 1;
        while i < j {
            if chars[i as usize] != chars[j as usize] {
                return false;
            }
            i += 1;
            j -= 1;
        }
        true
    }
    pub fn cut(chars: &Vec<char>, cache: &mut HashMap<Vec<char>, i32>) -> i32 {
        if chars.is_empty() {
            return 0;
        }
        if Solution::is_palindrome(chars) {
            return 0;
        }
        let mut ans = chars.len() as i32 - 1;
        for i in 0..chars.len() {
            if Solution::is_palindrome(&chars[..=i]) {
                let remain = if let Some(c) = cache.get(&chars[i + 1..]) {
                    *c
                } else {
                    Solution::cut(&chars[i + 1..].to_vec(), cache)
                };
                ans = ans.min(remain);
            }
        }
        cache.insert(chars[..].to_vec(), ans + 1);
        ans + 1
    }
    pub fn min_cut(s: String) -> i32 {
        let mut cache = HashMap::new();
        Solution::cut(&s.chars().collect(), &mut cache)
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值