【剑指 Offer II】 094. 最少回文分割
作者:互联网
题目:
给定一个字符串 s,请将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
示例 2:
输入:s = “a”
输出:0
示例 3:
输入:s = “ab”
输出:1
提示:
1 <= s.length <= 2000
s 仅由小写英文字母组成
注意:本题与主站 132 题相同: https://leetcode-cn.com/problems/palindrome-partitioning-ii/
答案:
class Solution {
public int minCut(String s) {
//换个角度想想,当切割次数最少使得切割后的所有字符串都是回文时,也正是这些回文子串最长的时候,那么如果说能找到以每个字符为中心的最长回文串,实际上就已经找到了答案。
//dp数组存的是当前位置的最少分割次数
if(s == null || s.length() <= 1)
return 0;
int len = s.length();
int[] dp = new int[len];
Arrays.fill(dp, len - 1);
for(int i = 0; i < len; i++){
minCutCount(s, i, i, dp);//奇数位中心
minCutCount(s, i, i + 1, dp);//偶数位中心
}
return dp[len - 1];
}
public void minCutCount(String s, int i, int j, int[] dp){
int len = s.length();
while(i >= 0 && j < len && s.charAt(i) == s.charAt(j)){
dp[j] = Math.min(dp[j], (i == 0 ? -1 : dp[i - 1]) + 1);
i--;
j++;
}
}
}
标签:子串,分割,Offer,int,示例,094,II,dp,回文 来源: https://blog.csdn.net/weixin_44485744/article/details/121334715