dfs加回文串的easy题。如果当前的子串是回文串,就有两种情况,在这里切一刀,往后继续找,或者带着自身这个回文串继续往后找。
递归边界就是index走到字符串的最后一位,而且加上最后一位的tmp是回文串,就让tmp数组加入这个回文串,然后res加入tmp数组
class Solution {
public:
bool isPalind(string s){
string tmp = s;
reverse(tmp.begin(),tmp.end());
return s == tmp;
}
void dfs(string s, vector<string> tmp, string tmpStr, int index){
//如果加上当前这个字符可以形成回文串,就有可以考虑在这里切一刀或者不切,如果不能形成,那么只能继续往后找
//判断现在是否是最后一个字符,而且tmpStr加上当前字符如果是回文子串就加入tmp,并将tmp加入res
tmpStr += s[index];
if(index == s.length()-1){
if(isPalind(tmpStr)){
tmp.push_back(tmpStr);
res.push_back(tmp);
}
return;
}
if(isPalind(tmpStr)){
tmp.push_back(tmpStr);
dfs(s,tmp,"",index+1);
tmp.pop_back();
}
dfs(s,tmp,tmpStr,index+1);
}
vector<vector<string>> partition(string s) {
//回文串就是中心扩散
//可以且任意刀,用dfs即可,看现在是切还是不切,如果切了之后不能形成回文子串就不切继续往后
if(s.length() == 0) return res;
vector<string> tmp;
dfs(s,tmp,"",0);
return res;
}
private:
vector<vector<string>> res;
};
20天前的我居然说这是easy题,其实并没有这么easy。
主要是考虑当前字符串是否能切,如果可以切,就切一刀后进行dfs,记得回溯。然后再进行不切的dfs,每次进入自动加上s[index],此时的递归边界就是到最后一位停下判断加上最后一位的tmpStr是否是回文串,如果是加入tmp,然后加入res。记得回溯!!
class Solution {
public:
bool isPalind(string s){
string str = s;
reverse(str.begin(),str.end());
return s == str;
}
void dfs(string s, string tmpStr, int index){
tmpStr += s[index];
//如果到了最后一位,注意是真正的最后一位,而不是越界的那一位
if(index == s.length()-1){
if(isPalind(tmpStr)){
tmp.push_back(tmpStr);
res.push_back(tmp);
tmp.pop_back();//这一步很重要,因为这个字符串是在这里加入tmp的,所以要在这里pop,在哪里加入就在哪里pop
}
return;
}
//判断是否可以切
if(isPalind(tmpStr)){
tmp.push_back(tmpStr);
dfs(s,"",index+1);
tmp.pop_back();
}
dfs(s,tmpStr,index+1);
}
vector<vector<string>> partition(string s) {
//回文串就是中心扩散
//可以且任意刀,用dfs即可,看现在是切还是不切,如果切了之后不能形成回文子串就不切继续往后
if(s.length() == 0) return res;
dfs(s,"",0);
return res;
}
private:
vector<vector<string>> res;
vector<string> tmp;
};