【算法/回溯算法/分割问题】题解+详细备注(共2题)
class Solution {
public:
bool isPalindrome(string s,int left,int right){
for(int i = left,j = right;i<j;++i,--j){
if(s[i] != s[j]) return false;
}
return true;
}
vector<vector<string>> result;
vector<string> path;
void backtracking(string s,int startIndex){
if(startIndex >= s.size()){
result.push_back(path);
return;
}
for(int i = startIndex;i<s.size();++i){
if(isPalindrome(s,startIndex,i)){
path.push_back(s.substr(startIndex,i-startIndex+1));
}else continue;
backtracking(s,i+1);
path.pop_back();
}
}
vector<vector<string>> partition(string s) {
backtracking(s,0);
return result;
}
};
class Solution {
public:
vector<string> result;
bool isValid(string s,int left,int right){
if(left > right) return false;
if(s[left] == '0' && left != right) return false;
int sum{};
for(int i = left;i<=right;++i){
if(s[i] < '0' || s[i] > '9') return false;
sum= sum*10 + (s[i] - '0');
if(sum > 255) return false;
}
return true;
}
void backtracking(string &s,int startIndex,int count){
if(count == 3){
if(isValid(s,startIndex,s.size()-1)){
result.push_back(s);
}
return;
}
for(int i = startIndex;i<s.size();++i){
if(isValid(s,startIndex,i)){
s.insert(s.begin()+i+1,'.');
count++;
backtracking(s,i+2,count);
s.erase(s.begin()+i+1);
count--;
}else break;
}
}
vector<string> restoreIpAddresses(string s) {
backtracking(s,0,0);
return result;
}
};