1、分割回文子字符串
给定一个字符串 s ,请将 s 分割成一些子串,使每个子串都是 回文串 ,返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
【传送门】
需要注意的是string.substr(a,b)
中a
表示需要截取的字符串的首位位置,b
表示截取的子字符串的长度
思路:常见的DFS的问题,搜索的两个参数分别是截取字符串的首位和末尾位置,要注意字符串的连续性
class Solution {
public:
string str;
int len;
vector<string>temp;
vector<vector<string>>ans;
bool isPalindromes(int left,int right){
if(left==right){
return true;
}
//left-right
//left+1,right-1
for(int i=0;;i++){
if(left+i>=right-i){
break;
}
if(str[left+i]!=str[right-i]){
return false;
}
}
return true;
}
void dfs_cut(int left,int right){
temp.emplace_back(str.substr(left,right-left+1));
if(right==len-1){
ans.emplace_back(temp);
}else{
for(int r=right+1;r<len;r++){
if(isPalindromes(right+1, r)){
dfs_cut(right+1, r);
temp.pop_back();
}
}
}
}
vector<vector<string>> partition(string s) {
len=s.length();
str=s;
for(int right=0;right<len;right++){
if(isPalindromes(0, right)){
dfs_cut(0,right);
temp.pop_back();
}
}
return ans;
}
};
2、复原IP
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。
【传送门】
思路:实际上还是一道DFS的搜索问题,考察的还是对于给定字符串的合法切割问题,可以参考上一题的思路解法,唯一要注意的是以字符串形式保存每次遍历后成为答案的结果——也就是IP串
class Solution {
public:
string str;
int len;
vector<string>temp;
vector<string>ans;
void dfs(int left,int right){
if(left>=len||right>=len){
}else if(right-left+1>1&&str[left]=='0'){
}else{
string sub=str.substr(left,right-left+1);
int num;
sscanf(sub.c_str(), "%d", &num);
if(num<=255){
temp.emplace_back(sub);
if(temp.size()==4){
string tstr="";
for(int i=0;i<4;i++){
if(i){
tstr+=".";
}
tstr+=temp[i];
}
if(right==len-1){
ans.emplace_back(tstr);
}
}else if(temp.size()<4){
for(int l=1;l<=3;l++){
dfs(right+1,right+l);
}
}
temp.pop_back();
}
}
}
vector<string> restoreIpAddresses(string s) {
//DFS
str=s;
len=str.length();
for(int r=0;r<3;r++){
dfs(0,r);
}
return ans;
}
};