Palindrome Partitioning

这道题采用动态规划的思想。参考了别人的做法。其中二位数组buf代表字符串中任意一段是否是回文,比如字符串aba,buf[1][1]代表字符串b是不是回文,buf[0][1]代表字符串ab是不是回文,所以题目的关键是求解这个二维数组

class Solution{
public:
	vector<vector<string>> result;
    vector<vector<string>> partition(string s) {
     int len = s.length();
	 vector<string> soloresult;

	 if(s.length() == 0)
	 return result;
     vector<vector<int>> buf(len, vector<int>(len));
     dp(s,buf);
     ds(s,buf,0,soloresult);;

	 return result;
	 
    }
	void ds(const string &s,vector<vector<int>>& buf,int index,vector<string>& soloresult)
    {
     
      for(int i=index ; i<s.length();i++)
      {
        if(buf[index][i] == 1)
        {
            soloresult.push_back(s.substr(index,i-index +1));
			if(i == s.length()-1)
			{
                result.push_back(soloresult);
			}
			else
			{
                ds(s,buf,i+1,soloresult);
			}
			soloresult.pop_back();
		}


	  }
	}
	void dp(const string& s,vector<vector<int>>& buf)
    {
      for(int i=s.length()-1; i>=0;i--)
        for(int j=i; j<s.length();j++)
        {
            if(i == j)
            {
               buf[i][j] =1;
			}
			else
			{
                if(s[i] == s[j])
                {
                   if(i+1 >= j-1 || buf[i+1][j-1] == 1)
                   {
                       buf[i][j] = 1;
				   }
				}

			}

		}
	}
	
};

 

posted on 2015-04-05 17:24  xgcode  阅读(138)  评论(0)    收藏  举报