实际上这就是个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在末尾时是个特例 } } };