您的位置:首页 > 其它

Palindrome Partitioning I and II leetcode

2014-08-26 19:38 302 查看
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];
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 动态规划