码迷,mamicode.com
首页 > 其他好文 > 详细

Palindrome Partitioning

时间:2014-08-13 12:23:16      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   os   io   for   ar   

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"]
  ]

思路:先使用DP确定s中任意两个字符之间是否构成回文。若isPalindrome[step][i]为true,则表示str.substr(i,step+i)构成回文。

        然后,使用DFS求解出所有合法划分。

 1 class Solution {
 2 public:
 3     vector<vector<string>> partition( string s ) {
 4         if( s.empty() ) { return palindromes; }
 5         size = s.length(); str = s;
 6         vector<bool> *isPalindrome = new vector<bool>[size];
 7         isPalindrome[0].resize( size, true );
 8         for( size_t step = 1; step != size; ++step ) {
 9             isPalindrome[step].resize( size-step, false );
10             if( step == 1 ) {
11                 for( size_t i = 0; i != size-1; ++i ) {
12                     if( s[i] == s[i+1] ) { isPalindrome[1][i] = true; }
13                 }
14             } else {
15                 for( size_t i = 0; i != size-step; ++i ) {
16                     if( s[i] == s[i+step] && isPalindrome[step-2][i+1] ) { isPalindrome[step][i] = true; }
17                 }
18             }
19         }
20         vector<string> palindrome;
21         GeneratePalindromes( palindrome, 0, isPalindrome );
22         delete [] isPalindrome;
23         return palindromes;
24     }
25 private:
26     void GeneratePalindromes( vector<string>& palindrome, int index, vector<bool>* isPalindrome ) {
27         if( index >= size ) { palindromes.push_back( palindrome ); return; }
28         for( int step = 0; step < size-index; ++step ) {
29             if( isPalindrome[step][index] ) {
30                 string subStr = str.substr( index, step+1 );
31                 palindrome.push_back( subStr );
32                 GeneratePalindromes( palindrome, index+step+1, isPalindrome );
33                 palindrome.pop_back();
34             }
35         }
36         return;
37     }
38     int size;
39     string str;
40     vector<vector<string>> palindromes;
41 };

另外,笔者发现使用vector<bool> *isPalindrome = new vector<bool>[size]会比使用vector<vector<bool>> isPalindrome(size)稍微快一些,这相当于用size个小的存储块取代了原来的大的存储块。不过,这么做需要添加delete [] isPalindrome释放掉new出的空间。

Palindrome Partitioning,布布扣,bubuko.com

Palindrome Partitioning

标签:style   blog   color   使用   os   io   for   ar   

原文地址:http://www.cnblogs.com/moderate-fish/p/3909395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!