132. 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.
解释:
让我们切割一个字符串,使得每个部分都是回文串,返回切割的最小次数
思考:
字符串,极值,肯定是用dp。但是回文类的题用dp很难做,因为不好判断递推关系式。这个题答案用了一种非常非常巧妙的办法,中心扩展法,也就是说最小切割次数,其实就是让每个回文串尽可能的延伸,这样它覆盖的位置只需一次切割,然后在这个延伸的过程中寻找可以延伸的范围内的最小值dp[i],用dpi来更新dpj即可,ij之间的字符串都只需一次切割。时间效率100%
答案:
class Solution {
public int minCut(String s) {
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++){
// 注意偶数长度与奇数长度回文串的特点
mincutHelper(s , i , i , dp); // 奇数回文串以1个字符为中心
mincutHelper(s, i , i+1 , dp); // 偶数回文串以2个字符为中心
}
return dp[len-1];
}
private void mincutHelper(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++;
}
}
}