int minCut(string s)
	{
		int size = s.size();
		if (size == 0)
		{
			return 0;
		}
		vector<int> dp(size, INT_MAX);
		vector<vector<bool> > isPalind(size, vector<bool>(size));
		for (int i = 0; i < size; ++i)
		{
			isPalind[i][i] = true;
		}
    for(int i = 1; i < size; ++i)
    {
    	for(int j = 0; j < size; ++j)
    	{
    		if(j+i < size)
    		{
    			if(s[j] == s[j+i] && ((i <= 2) || isPalind[j+1][j+i-1]))
    			{
    				isPalind[j][j+i] = true;
    			}
    		}
    	}
    }
		dp[0] = 0;
		for (int i = 1; i < size; ++i)
		{
			if (isPalind[0][i])
			{
				dp[i] = 0;
			}
			else
			{
				for (int j = 0; j < i; ++j)
				{
					if (isPalind[j + 1][i])//如果用函数判别回文,这会产生大量的重复计算!
					{
						if (dp[j] + 1 < dp[i])
						{
							dp[i] = dp[j] + 1;
						}
					}
				}
			}
		}
		return dp[size - 1];
	}
Esempio n. 2
0
	void part(vector<vector<string>>&result, vector<string>&cur, 
		string s,int start)
	{
		if (start==s.size()){
			result.push_back(cur);
			return;
		}
		for ( size_t i = start; i < s.size(); i++){
			if (isPalind(s, start, i)){
				cur.push_back(s.substr(start, i - start + 1));
				part(result, cur, s, i + 1);
				cur.pop_back();//回溯
			}
		}
	}