实际上这就是个dfs,对于每个字符有两种可能,一种是在后面加小数点,一种是不加,通过剪枝和条件判断来获得我们想要的结果
class Solution {
public:
vector<string> res; //记录最终结果
string str;
vector<string> restoreIpAddresses(string s) {
str = s; //将s作为全局变量好操作
helper("", 0, 0, 0);
return res;
}
void helper(string cur, int num, int left, int point) { //cur是当前字符串,num是当前数字(起始为0),left是当前字符指针,point是小数点数量
if(point >= 4) return; //排除4个小数点的情况
if(left == str.size()) { //当指针走完
if(point == 3) res.push_back(cur); //有3个小数点的字符串才能加入结果
return;
}
int bit = str[left] - '0'; //当前字符转换为数字
num *= 10; num += bit; //加在当前数字后
if(num <= 255) { //剪去当前数字大于255的分支
cur += str[left]; //不管加不加小数点都要先把当前字符加在当前字符串后面
if(left < str.size() - 1) helper(cur + '.', 0, left + 1, point + 1); //最后一位后面不能加小数点
if(num > 0 || (num == 0 && left == str.size() - 1)) helper(cur, num, left + 1, point); //num大于0保证了不会出现两个0没有用小数点分割开的情况,但是当0在末尾时是个特例
}
}
};
京公网安备 11010502036488号