大例子还是没通过,先放着
public class Solution {
int[][] is_sub_palind;
public int minCut(String s){
int n = s.length();
int[] p = new int[n+1];
is_sub_palind= new int[n+1][n+1];
for(int i=0;i<n+1;i++){
p[i] = 1000000;
for(int j=0;j<n+1;j++){
is_sub_palind[i][j] = -1;
}
}
p[0]=0;
for(int i=0;i<=n;i++){
int low = 10000000;
for(int k=0;k<i;k++){
if(isPalindrome(s,k+1,i)){
if(k==0)p[i]=0;
else{p[i]=p[k]+1;}
}
else{
p[i]=p[k]+i-k;
}
if(p[i]<low){
low = p[i];
}
}
p[i] = low;
//System.out.println(p[i]);
}
return p[n];
}
/*
public int minCut(String s) {
// Start typing your Java solution below
// DO NOT write main() function
int n = s.length();
int[][] p = new int[n+1][n+1];
is_sub_palind= new int[n+1][n+1];
for(int i=0;i<n+1;i++)
for(int j=0;j<n+1;j++){
p[i][j] = 1000000;
is_sub_palind[i][j] = -1;
}
//if(isPalindrome(s,1,n)==true)return 0;
for(int k=0;k<=n-1;k++){
for(int i=1;i<=n-k;i++){
int sum=p[i][i+k];
//if(is_sub_palind[i][i+k]==1){
if(isPalindrome(s,i,i+k)==true){
p[i][i+k]=0;
}
else{
for(int t=0;t<k;t++){
sum = p[i][i+t]+p[i+t+1][i+k]+1;
if(sum<p[i][i+k])
p[i][i+k]=sum;
}
}
}
}
return p[1][n];
}
*/
private boolean isPalindrome(String s,int i,int j){
if(i==j)return true;
if(i>j)return false;
if(is_sub_palind[i][j]==1)return true;
if(is_sub_palind[i][j]==0)return false;
int i1=i-1;
int j1=j-1;
while(i1<j1){
if(s.charAt(i1++)==s.charAt(j1--))continue;
is_sub_palind[i][j]=0;
return false;
}
is_sub_palind[i][j]=1;
return true;
}
public static void main(String[] args){
//String s= "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
String s = "dde";
System.out.println(s.length());
Solution a = new Solution();
int t = a.minCut(s);
System.out.println(t);
}
}
public class Solution {
int[][] is_sub_palind;
public int minCut(String s){
int n = s.length();
int[] p = new int[n+1];
is_sub_palind= new int[n+1][n+1];
for(int i=0;i<n+1;i++){
p[i] = i;
for(int j=0;j<n+1;j++){
is_sub_palind[i][j] = -1;
}
}
for(int i=1;i<=n;i++){
int low = p[i];
for(int k=0;k<i;k++){
if(isPalindrome(s,k+1,i)){
if(k==0)p[i]=0;
else{p[i]=p[k]+1;}
}
else{
p[i]=p[k]+i-k;
}
if(p[i]<low){
low = p[i];
}
}
p[i] = low;
}
return p[n];
}
private boolean isPalindrome(String s,int i,int j){
if(i==j)return true;
if(i>j)return false;
if(is_sub_palind[i][j]==1)return true;
if(is_sub_palind[i][j]==0){if(i==1&&j==2)return false;}
if(s.charAt(i-1)==s.charAt(j-1)){
if(i+1<j-1){
if(is_sub_palind[i+1][j-1]==1){is_sub_palind[i][j]=1;return true;}
else {is_sub_palind[i][j]=0;return false;}
}
else {is_sub_palind[i][j]=1;return true;}
}
is_sub_palind[i][j]=0;
return false;
}
public static void main(String[] args){
//String s= "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
String s = "aabaae";
//System.out.println(s.length());
Solution a = new Solution();
long startTime=System.currentTimeMillis();
int t = a.minCut(s);
long endTime=System.currentTimeMillis();
System.out.println(t);
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
}查找是否是回文串也要用dp。
本文介绍了一种使用动态规划解决字符串最小切割问题的方法,目的是将字符串分割成多个子串,确保每个子串都是回文串,并尽可能减少切割次数。
2089

被折叠的 条评论
为什么被折叠?



