【称号】
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"] ]
【题意】
给定一个字符串s, 要求对s进行划分,划分后每一个子串都是回文串。
要求返回全部的划分情况
【思路】
直观思路是使用逐层递归。先确定第一个点。然后确定第二个点,再确定第三个点,依次类推。这样的方式的时间复杂度很高。本题使用DP:先计算出随意两个位置i,j之间的子串是否是回文串,用IsPalindrome[i][j]表示。
【代码】
class Solution { public: void getPartition(vector<vector<string> >&result, vector<string>&splits, int start, string&s, vector<vector<bool> >&isPal){ //spits-已切分的结果,start-当前切分開始的位置 if(start==s.length()){ vector<string> newSplits = splits; result.push_back(newSplits); return; } for(int end=start; end<s.length(); end++){ if(isPal[start][end]){ splits.push_back(s.substr(start, end-start+1)); getPartition(result, splits, end+1, s, isPal); splits.pop_back(); } } } vector<vector<string>> partition(string s) { vector<vector<string> >result; int len=s.length(); if(len==0)return result; vector<vector<bool> > isPal(len, vector<bool>(len, false)); //初始化isPal[i][i]=true; for(int i=0; i<len; i++) isPal[i][i]=true; //初始化相邻两位字符构成的子串 for(int i=0; i<len-1; i++) if(s[i]==s[i+1])isPal[i][i+1]=true; //推断其它i<j的位置 for(int i=len-3; i>=0; i--) for(int j=i+2; j<len; j++) isPal[i][j]=(s[i]==s[j]) && isPal[i+1][j-1]; //确定全部的组合 vector<string> splits; getPartition(result, splits, 0, s, isPal); return result; } };
版权声明:本文博主原创文章。博客,未经同意不得转载。