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"] ]DFS:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string> > res;
vector<string> tmp;
if(s.size() == 0) {
res.push_back(tmp);
return res;
}
findp(res,tmp,s,0);
return res;
}
void findp(vector<vector<string> >& res, vector<string>& tmp,const string s, int start) {
if(start == s.size()) {
res.push_back(tmp);
return;
}
for(int i= start+1;i<=s.size();i++) {
if(isPa(s.substr(start,i-start))) {
tmp.push_back(s.substr(start,i-start));
findp(res,tmp,s,i);
tmp.pop_back();
}
}
}
bool isPa(string s) {
int begin = 0;
int end = s.size()-1;
while(begin<end) {
if(s[begin] != s[end])
return false;
begin++;
end--;
}
return true;
}
};
Palindrome Partitioning II
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s = "aab"
,
Return 1
since the palindrome partitioning ["aa","b"]
could be produced using 1 cut.
Calculate and maintain 2 DP states:
-
pal[i][j] , which is whether s[i..j] forms a pal
-
d[i], which is the minCut for s[i..n-1]
Once we comes to a pal[i][j]==true:
- if j==n-1, the string s[i..n-1] is a Pal, minCut is 0, d[i]=0;
- else: the current cut num (first cut s[i..j] and then cut the rest s[j+1...n-1]) is 1+d[j+1], compare it to the exisiting minCut num d[i], repalce if smaller.
d[0] is the answer.
class Solution {
public:
int minCut(string s) {
int n = s.size();
if(n == 0 || n == 1)
return 0;
vector<int> dp(n,0);
<span style="background-color: rgb(255, 255, 102);">vector<vector<int> > pal(n,vector<int>(n,0));</span>
for(int i=n-1;i>=0;i--) {
dp[i] = n-1-i;
for(int j=i;j<n;j++) {
if(s[i]==s[j] && ((j-i)<2 || pal[i+1][j-1] == 1)) {
pal[i][j] = 1;
if(j == n-1) {
dp[i] = 0;
} else if(dp[i]>(dp[j+1]+1))
dp[i] = dp[j+1]+1;
}
}
}
return dp[0];
}
};