Initilize p[i][j] = False, which represents whether the substring [i:j] of the string is palindrome.
Initilize minCut[i] = i, which represents the minimum cut of the substring ends at i.
If p[i][j] = True, then minCut[i] = min(minCut[i], minCut[j-1] + 1). We can find at least one palindrome until index of i, because any character is palindrome.
Return minCut[len(s)-1]
classSolution:defminCut(self,s:str) ->int: p = [[False]*len(s)for i inrange(len(s))] minCut = [i for i inrange(len(s))]# self.isPalin(s, p)for i inrange(1, len(s)):for j inrange(0, i+1):if s[i]== s[j]and (j+1>= i-1or p[j+1][i-1] ==True): p[j][i] =Trueif j ==0: minCut[i]=0breakelse: minCut[i]=min(minCut[i], minCut[j-1]+1)return minCut[len(s)-1]# 计算 string 中从 j 到 i 是否是回文,用p[j][i]表示 defisPalin(self,s,p):for i inrange(len(s)):for j inrange(i+1):if i == j: p[j][i] =Trueelse:if s[j]== s[i]:if j+1>= i-1or p[j+1][i-1] ==True: p[j][i] =True
classSolution {publicintminCut(String s) {int[] minCut =newint[s.length()];for(int i =0; i <s.length(); i ++) { minCut[i] = i; }boolean[][] palind =newboolean[s.length()][s.length()];fillPalind(s, palind);for(int i =1; i <s.length(); i ++)for(int j =0; j <= i; j ++) {if(palind[j][i]) {if(j ==0) { minCut[i] =0;break; } else { minCut[i] =Math.min(minCut[i], minCut[j-1]+1); } } }return minCut[s.length() -1]; }privatevoidfillPalind(String s,boolean[][] palind) {for(int i =0; i <s.length(); i ++)for(int j =0; j <= i; j ++ ) {if(i == j) palind[j][i] =true;elseif(s.charAt(j) ==s.charAt(i)) {if(j+1>= i-1|| palind[j+1][i-1] ==true) palind[j][i] =true; } } }}