
一、分割回文串

判断是否是回文串函数,用双指针法最佳
分割,顾名思义,就是取子串,发生在横向遍历时
这里用到了string的substr函数:substr(int begin,int length);
class Solution {
private:
bool isBack(string str,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
if(str[i]!=str[j])
return false;
}
return true;
}
vector<string> path;
vector<vector<string>> result;
void backtracking(string s,int index){
if(index>=s.size()){
result.push_back(path);
return;
}
for(int i=index;i<s.size();i++){
if(isBack(str,index,i)){
string tem=s.substr(index,i-index+1);
path.push_back(tem);
}else{
continue;
}
backtracking(s,i+1);
path.pop_back();
}
}
public:
vector<vector<string>> partition(string s) {
backtracking(s,0);
return result;
}
};
二、复原IP地址

这题也属于分割问题,但是明显有难度
建议背下来
class Solution {
private:
bool isLegal(string s,int start,int end){
if(start>end) return false;
if(s[start]=='0'&&start!=end) return false;
int num=0;
for(int i=start;i<=end;i++){
if(s[i]<'0'||s[i]>'9')
return false;
num=num*10+(s[i]-'0');
}
if(num>255) return false;
return true;
}
vector<string> result;
void backtracking(string s,int index,int cnt){
if(cnt==3){
if(isLegal(s,index,s.size()-1))
result.push_back(s);
return;
}
for(int i=index;i<s.size();i++){
if(isLegal(s,index,i)){
s.insert(s.begin()+i+1,'.');
}else{
break;
}
backtracking(s,i+2,cnt+1);
s.erase(s.begin()+i+1);
}
}
public:
vector<string> restoreIpAddresses(string s) {
if(s.size()<4||s.size()>12) return result;
backtracking(s,0,0);
return result;
}
};