【leetcode】Palindrome Partitioning

Palindrome Partitioning

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"]
  ]
为了加速运算,可以利用动态规划,求出满足回文的子串的位置
 
palindrome[i][j]表示了第字符串中,s[i,i+1,……, j]是否是回文
 
可以有以下递推公式:
if(i==j) palindrome[i][j]=true;
if(i-j=1)palindrome[i][j]=s[i]==s[j];
if(i-j>1)palindrome[i][j]=palindrome[i+1][j-1]&&s[i]==s[j]
 
 
得到了该回文表后,我们利用回溯法得到所有的子串
 
 
 
 1 class Solution {
 2 public:
 3  
 4     vector<vector <string> > res;
 5    
 6     vector<vector<bool> > palindrome;
 7     string s;
 8     int n;
 9    
10     vector<vector<string>> partition(string s) {
11        
12          this->s=s;
13          this->n=s.length();
14          
15          vector<vector<bool> > palindrome(n,vector<bool>(n));
16          getPalindrome(palindrome);
17          this->palindrome=palindrome;
18          
19          vector <string> tmp;
20          getPartition(0,tmp);
21          
22          return res;
23     }
24    
25     //回溯得到子串
26     void getPartition(int start,vector<string> tmp)
27     {
28  
29         if(start==n)
30         {
31             res.push_back(tmp);
32             return;
33         }
34        
35         for(int i=start;i<n;i++)
36         {
37             if(palindrome[start][i])
38             {
39                 tmp.push_back(s.substr(start,i-start+1));
40                 getPartition(i+1,tmp);
41                 tmp.pop_back();
42             }
43         }
44     }
45    
46    
47    
48     void getPalindrome(vector<vector<bool> > &palindrome)
49     {
50         int startIndex=0;
51         int endIndex=n-1;
52        
53         for(int i=n-1;i>=0;i--)
54         {
55             for(int j=i;j<n;j++)
56             {
57                 if(i==j)
58                 {
59                     palindrome[i][j]=true;
60                 }
61                 else if(j-i==1)
62                 {
63                     palindrome[i][j]=(s[i]==s[j]);
64                 }
65                 else if(j-i>1)
66                 {
67                     palindrome[i][j]=(s[i]==s[j]&&palindrome[i+1][j-1]);
68                 }
69             }
70         }
71     }
72 };

 

posted @ 2014-12-27 22:53  H5开发技术  阅读(145)  评论(0编辑  收藏  举报