class Solution {
public:
int minCut(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
//palLens(i)表示s[i]-s[n]的cutNum
//palLens(i)=min{ 1+palLens(j+1) if s(i,j) is palindrome, j from i until n }O(n*n*O(isPalindrome))
//isPalindrome检查回文,p(i)(j)=true if (s(i)==s(j) && (i-j<2 || p(i+1)(j-1))[i-j<2表示a,ab,aa这样一到两个的终端情况]
//for(i){for(j<=i)}保证了处理p[j][i]时,p[j+1][i-1]已经被计算好了,O(isPalindrome)=O(1)
//总时间O(n*n)
int len=s.size();
if(len==0) return 0;
vector<int> palLens(len+1);
for(int i=0;i<=len;i++)//s[0]-s[i]之间的要切几刀
palLens[i]=i-1;//palLens[1]=0表示s中有一个字符时,切0刀
vector<vector<bool> >p(len,vector<bool>(len,false));//p[i][j]为true表示s[i]到s[j]之间为回文串
for(int i=1;i<=len-1;i++)//i从1开始,保证循环体中p[][i-1]中从p[][0]开始;另外p[][0]均为false,从p[][1]到p[][len]才是合理的判断
for(int j=0;j<=i;j++)//j<=i保证了处理p[j][i]时,p[j+1][i-1]已经被计算好了
{
if( (s[i]==s[j])&&(i-j<2 || p[j+1][i-1]) )
{
p[j][i]=true;
palLens[i+1]=min(palLens[i+1],1+palLens[j]);//从palLens[1]开始计算,因为palLens[0]这个特殊情况的处理已经return了
}
}
return palLens[len];
}
};
【leetcode】Palindrome Partitioning II
最新推荐文章于 2019-06-01 11:25:07 发布