LeetCode-笔记-131. 分割回文串
131. 分割回文串
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是 回文串 。返回 s
所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a"
输出:[["a"]]
思路在代码里:
如下图所示:aab先拆成a,ab,在a是回文串的情况下再拆ab,ab可以拆成a,b与ab,ab不是回文串顾舍去,最终得到a,a,b。然后再拆成aa,b。同理拆成aab时aab不是回文串舍去。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YeOm92zy-1619670009162)(C:\Users\wei\AppData\Roaming\Typora\typora-user-images\image-20210429121645365.png)]
class Solution {
public:
vector<string> vs; //定义字符串容器
vector<vector<string>> vvs;//定义二维字符串容器
bool isPali(string _s,int start,int end,vector<vector<int>> &mn){//判断是否是回文串,起始位置start,末位置end
int i=start;
int j=end;
while(start<end){
if(_s[start]==_s[end]) {
start++;
end--;
}
else{
mn[start][end]=2;
return false;
}
}
mn[i][j]=1;
return true;
}
void dfs(int addr,string s,vector<vector<int>> &mn){//递归,分割字符串,并判断是否是回文串
if(addr==s.size()){
vvs.push_back(vs);
return;
}
for(int i=addr;i<s.size();++i){
//cout<<addr<<"***"<<i<<endl;
//cout<<isPali(s,addr,i)<<endl;
if(mn[addr][i]==2) continue;
if(mn[addr][i]==1||isPali(s,addr,i,mn)){
vs.push_back(s.substr(addr, i - addr + 1));
dfs(i+1,s,mn);
vs.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
vector<vector<int>> mn(s.size(),vector<int>(s.size(),0));//记忆数组避免重复判断
dfs(0,s,mn);
return vvs;
}
};