任务日期:6.29
目一链接:93. 复原 IP 地址 - 力扣(LeetCode)
思路:利用分割子串的思想递归搜索字符串,比较新的地方在于递归结束条件和回溯时的代码
代码:
class Solution {
public:
vector<string> result;
//stratindex记录下一层递归搜索的起始位置,pointnum记录点的个数
void backtracking(string &s,int stratindex,int pointnum) {//int 值得变量不需要加&
//确定递归终止条件
if(pointnum == 3) {
if(isvalid(s,stratindex,s.size() - 1)) result.push_back(s);//isvalid函数里面是下标值
return;
}
//确定当前层递归逻辑
//截取子串
for(int i = stratindex;i < s.size();i ++) {//此时区间stratidex到i就是截取区间,判断它是否合法
if(isvalid(s,stratindex,i)) {
s.insert(s.begin() + i + 1,'.');//在下标为i + 1的点的前面插入元素
//pointnum ++;
backtracking(s,i + 2,++ pointnum);//递归到下一层:此时的下标是i + 2,因为多了一个.
//回溯:撤销最近的决策所以startindex 不改变
pointnum --;
s.erase(s.begin() + 1 + i);//删除s中的.
} else break;//如果截取的子串不合法,结束当前层
}
}
bool isvalid(string &s,int start,int end) {
if(start > end) return false;
if(s[start] == '0' && start != end) return false;//s是字符串
int num = 0;
for(int i = start;i <= end;i ++) {
if(s[i] > '9' || s[i] < '0') return false;
num = num * 10 + s[i] - '0';
}
if(num > 255) return false;
return true;
}
vector<string> restoreIpAddresses(string s) {
if(s.size() < 4 || s.size() > 12) return result;
backtracking(s,0,0);
return result;
}
};
难点:1.子函数里的变量什么时候加&
2.回溯算法只撤销最近的决策,所以startindex不变
题目二链接:
思路:
代码:
难点:
解释细节1:
题目三链接:
思路:
代码:
难点:
解释细节1: