给定一个字符串s,将s分割成一些子串,使每个子串都是回文。返回s符合要求的的最少分割次数。
您在真实的面试中是否遇到过这个题?
Yes
样例
比如,给出字符串s = "aab",
返回 1, 因为进行一次分割可以将字符串s分割成["aa","b"]这样两个回文子串
标签 Expand
相关题目 Expand
解题思路:
按照分割回文串去实现,找出最小的分割次数超时。
改为用动态规划去实现。设置一个数组2boolean维数组isPd[ ][ ]
isPd[ i ][ j ] = true 表示字符串s[ i , j ]是回文串,isPd[ i ][ j ] = false 表示字符串s[ i ][ j ]不是回文串。也用动态规划去生成
再初始化一个int一维数组min[ ],min[ i ] 表示字符串 S[ i , n-1] 的最小分割数,若i 到 n-1之间存在一个 j能分割 ,此时的min[ i ] = min( min[ i ],min[ j] +1 );
public class Solution {
/**
* @param s a string
* @return an integer
*/
public int minCut(String s) {
// write your code here
if (null == s || 0 == s.length())
return 0;
int min[] = new int[s.length()];
boolean isPd[][] = new boolean[s.length()][s.length()];
setPd(isPd, s);
for(int i=s.length()-1;i>=0;i--){
if(isPd[i][s.length()-1]){
min[i] = 0;
continue;
}
min[i] = Integer.MAX_VALUE;
for(int j=i+1;j<s.length();j++){
if(isPd[i][j-1]){
if(min[i] > min[j]+1){
min[i] = min[j]+1;
}
}
}
}
return min[0];
}
public void setPd(boolean[][] isPd,String s){
for(int len = 1; len <=s.length();len++){
for(int i=0;i<=s.length()-len;i++){
int j = i+len-1;
if(len==1){
isPd[i][j] = true;
}else if(len==2){
isPd[i][j] = (s.charAt(i)==s.charAt(j));
}else{
isPd[i][j] = (isPd[i+1][j-1]&&(s.charAt(i)==s.charAt(j)));
}
}
}
}
};