93. Restore IP Addresses

问题

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

例子

Given "25525511135",
return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

分析

dfs,枚举各种分割的情况,如果得到的结果满足下面的所有条件,则是一个合法的IP地址:

  • 字符串被3个.号分成4个部分
  • 每部分的值在[0-255]范围内
  • 除非等于0,否则每部分数字的开头不能是0

要点

dfs,及时裁剪不符合条件的状态

时间复杂度

O(3^3),因为每个.号的插入位置都可以有三种选择

空间复杂度

O(1)

代码

class Solution {
public:
    vector restoreIpAddresses(string s) {
        vector res;
        dfs(res, s);
        return res;
    }
    
private:
    // ip地址的格式:XXX.XXX.XXX.XXX,XXX∈[0,255]
    // len表示当前ip的长度,part表示当前ip已经包含了几部分(.号将ip地址分为四部分)
    void dfs(vector &res, const string &s, string ip = "", int len = 0, int part = 0) {
        if (part > 4) return;
        if (part == 4 && len == s.size()) {
            ip.pop_back();
            res.push_back(ip);
            return;
        }
        
        int num = 0;
        // 每部分数字的开头不能是0,除非数字本身就是0
        int end = min(s[len] == '0' ? 1 : 3, (int)s.size() - len);
        for (int i = 0; i < end; i++) {
            num = 10 * num + s[len + i] - '0';
            if (num > 255) break; // 每部分数字要在[0-255]范围内
            
            ip += s[len + i];
            dfs(res, s, ip + '.', len + i + 1, part + 1);
        }
    }
};

你可能感兴趣的:(93. Restore IP Addresses)