回溯大法
- IP地址有四个位置,每个位置的范围为 [0,255]
- 当0开头时,这个位置只能为0,不能为00或者01等其他值
- 当四个位置都被填充 或者 字符串被使用完时,进行回溯
- 其中,四个位置都被填充 并且 字符串被使用完时,代表发现一个新的IP地址
- 其他情况均不合法,直接返回
- 每一次回溯之后,尝试在当前IP位置再加一位,进行边界判定
- 判定成功,则继续递归寻找下一个位置的值
- 判定失败,则进行回溯,回溯到上一个位置
class Solution {
private:static constexpr int SEG_COUNT = 4;vector<string> res;vector<int>segments;
public:void dfs(const string &s, int segID, int str_start){if(segID == SEG_COUNT) {if(str_start == s.size()) {string IPAddr = "";for(int i=0;i<SEG_COUNT;i++){IPAddr += to_string(segments[i]);if(i != SEG_COUNT-1)IPAddr += ".";}res.push_back(IPAddr);}return;}if(str_start == s.size()) return;if(s[str_start] == '0') {segments[segID] = 0;dfs(s, segID+1, str_start+1);return;}int addr = 0;for(int i=str_start; i<s.size(); i++){addr = addr*10 + (s[i]-'0'); if(addr>255) return;segments[segID] = addr;dfs(s, segID+1, i+1);}}vector<string> restoreIpAddresses(string s) {segments.resize(SEG_COUNT);dfs(s, 0, 0);return res;}
};