【回溯】【leetcode】根据数字字符串复原IP地址

题目:

给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效 IP 地址。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

来源:

93. 复原 IP 地址

解题思路:回溯

定义一个变量n,存储[start, i]的数值,当n满足IP条件时,开始递归+回溯;不满足时退出循环。

  • 递归终止条件:数字达到4个时(从0开始,达到4即可,不必判断大于4的情况)
  • 结果满足条件:数字达到4个时,并且字符串处理完成
  • 剪枝条件:组成数字大于255(非法IP数字)
  • 特殊处理:IP段中的0单独处理
class Solution {
public:
    vector<string> result;
    vector<string> path;
    vector<string> restoreIpAddresses(string s) {
        back(s, 0);
        return result;
    }
    void back(const string& s, int start) {
        if (path.size() == 4) {
            if (start == s.size()) {
                result.push_back(path[0]+"."+path[1]+"."+path[2]+"."+path[3]);
            }
            return;
        }

        if (s[start] == '0') {
            path.push_back("0");
            back(s, start + 1);
            path.pop_back();
            return;
        }
        int n = 0;
        for (int i = start; i < s.size(); i++) {
            n = n * 10 + s[i] - '0';
            if (n > 255) break;
            path.push_back(s.substr(start, i - start + 1));
            back(s, i + 1);
            path.pop_back();
        }
    }
};

猜你喜欢

转载自blog.csdn.net/hbuxiaoshe/article/details/114998431
今日推荐