//dp[i]是回文就是0,否则就是Math.min(dp[j]+(j+1到i之间是不是回文?0:它需要分割的最小次数)+1);
当前dp[i]
图片中应该是Math.min(),我着急写成max了,大家注意啊!
1.若是回文串,则分割大小为0
2.若不是回文串,则默认大小给它的索引i,代表每一个词分一次,这是最差的分割,也就是这段区间能分割的最大次数
3.如图:
4.如图:
5.一直滑到i的前一个,如图:
求出dp[i]的最小值,依次类推,知道求出最后的dp[len-1]也就是0~len-1也就是str的最小分割次数了
private int getSplit2PalindromeMinCount(String str){ //dp[i]是回文就是0,否则就是Math.min(dp[j]+(j+1到i之间是不是回文?:0:)+1); //dp[i]表示0~i最小的切割次数 int len=str.length(); int[] dp=new int[len]; for (int i = 0; i < len; i++) { dp[i]=isPalindrome(str.substring(0,i+1))?0:i; if(dp[i]==0)continue; for(int j=0;j<i;j++){ String s=str.substring(j+1,i+1); if(isPalindrome(s)){ dp[i]=Math.min(dp[i],dp[j]+1); } else { dp[i]=Math.min(dp[i],dp[j]+1+getSplit2PalindromeMinCount(s)); } } } return dp[len-1]; } private boolean isPalindrome(String str){ int len=str.length(); int l=0,r=len-1; while (l<=r){ if(str.charAt(l)!=str.charAt(r))return false; l++;r--; } return true; }