Question:


Given a string

s

, partition

s

such that every substring of the partition is a palindrome.


Return all possible palindrome partitioning of

s

.


For example, given

s

=

"aab"

,


Return

  [
    ["aa","b"],
    ["a","a","b"]
  ]


Anwser 1 :

class Solution {
public:
    vector<vector<string>> partition(string s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<vector<string>> ret;
        if(s.length() == 0)
            return ret;
            
        vector<int> vec;
        vec.push_back(-1);
        
        part(s, 0, ret, vec);
        return ret;
    }

    void part(string s, int i, vector<vector<string>> &ret, vector<int> &vec) {
        if(i == s.length()){
            vector<string> v;
            int len = vec.size();
            for(int k = 0; k < len-1; k++)   
                v.push_back(s.substr(vec[k]+1, vec[k+1] - vec[k]));

            ret.push_back(v);
            return;
        }

        for(int j = i; j < s.length(); j++) {
            if(isPalindrome(s, i, j)) {
                vec.push_back(j);
                part(s, j+1, ret, vec);
                vec.pop_back();    
            }
        }
    }

    bool isPalindrome(string &s, int i, int j)
    {
        while(i < j)
        {
            if(s[i++] != s[j--])
                return false;
        }

        return true;  
    }
};


Anwser 2 :

class Solution {
public:
    vector<vector<string>> partition(string s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
		int len=s.length();
		int BIG=2*len;
		int num_line=len+1;
		vector<int> vec(num_line*num_line);
        
		for(int l=1; l<=len; l++)//两个木板之间有多少个字符
		{
			for (int i=0; i+l<num_line; i++)//从第0个木板开始,i+l为木板的序号
			{
				if (l==1)
				{
					vec[i*num_line+(i+l)]=1;
				}
				else if(l==2)
				{
					if (s[i]==s[i+l-1])
						vec[i*num_line+(i+l)]=1;
					else
						vec[i*num_line+(i+l)]=BIG;
				}
				else
				{
					if (s[i]==s[i+l-1])
						vec[i*num_line+(i+l)] = vec[(i+1)*num_line+(i+l-1)];
					else
						vec[i*num_line+(i+l)]=BIG;
				}
			}
		}

		vector<vector<int>> index;
		vector<int> start;
		start.push_back(0);
		index.push_back(start);
		for (int i=0;i<num_line;i++)
		{
			int max_len=index.size();
			vector<vector<int>>::iterator iter=index.begin();
			for(int j=0;j<max_len;j++)
			{
				vector<int> current_line=index[j];
				if (current_line.back()>=num_line-1) continue;
				bool first_time=true;
				for(int a=current_line.back()+1;a<num_line;a++)
				{
					if(vec[current_line.back()*num_line+a]==1)
					{
						if (first_time)	
						{
							index[j].push_back(a);
							first_time=false;
						}
						else
						{
							vector<int> tmp=current_line;
							tmp.push_back(a);
							index.insert(index.begin()+j,tmp);
							j++;
							max_len++;
						}
					}
				}
			}
		}

		vector<vector<string>> res;
		for(int i=0;i<index.size();i++)
		{
			vector<string> tmp;
			res.push_back(tmp);
			for(int j=0;j<index[i].size()-1;j++)
			{
				res[i].push_back(s.substr(index[i][j],index[i][j+1]-index[i][j]));
			}
		}
		return res;
    }
};



参考推荐:


leetcode:Palindrome Partitioning


Palindrome Partitioning