一、LeetCode 131 分割回文串
题目描述:
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
思路:
dfs回溯算法
代码如下:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>>res;
vector<string>path;
if(s.size()==0) return res;
dfs(s,0,path,res);
return res;
}
void dfs(string s,int cur,vector<string>&path,vector<vector<string>>&res){
if(cur==s.size()){
res.push_back(path);
}
for(int end=cur+1;end<=s.size();end++){
string ss=s.substr(cur,end-cur);
if(!isPalindrome(ss)) continue;
path.push_back(ss);
dfs(s,end,path,res);
path.pop_back();
}
}
bool isPalindrome(string s){
int l=0,r=s.size()-1;
while(l<r){
if(s[l]!=s[r]){
return false;
}
l++;
r--;
}
return true;
}
};
二、LeetCode 132 分割回文串II
题目描述:
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
思路:
动态规划
代码如下:
class Solution {
public:
int minCut(string s) {
int n=s.size();
vector<vector<bool>>g(n,vector<bool>(n,true));
vector<int>f(n,INT_MAX);
for(int i=n-1;i>=0;i--){//判断每个子串是否是回文串
for(int j=i+1;j<n;j++){
g[j][i]=(s[i]==s[j])&&g[i+1][j-1];
}
}
for(int i=0;i<n;i++){//动态规划求解
if(g[0][i]){
f[i]=0;
}
else{
for(int j=0;j<i;j++){
if(g[j][i]){
f[i]=min(f[i],f[j]+1);
}
}
}
}
return f[n-1];
}
};