LeetCode 93. Restore IP Addresses 解题报告

LeetCode 93. Restore IP Addresses 解题报告

题目描述

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


示例

Example 1:
Given “25525511135”,
return [“255.255.11.135”, “255.255.111.35”]. (Order does not matter)


注意事项

没有给出.


解题思路

我的思路:

这道题的意思是给定一个仅包含数字的字符串,找到所有由该字符串组成的合法的IP地址。需要注意以下细节:
1.IP地址需要用到整个字符串,因此例子“25525511135”就只能是”255.255.11.135”和”255.255.111.35”。
2.IP地址由四段组成,每一段的范围都是0-255,并且不能有前导零。
解题的思想是递归跟回溯。在一次递归调用中使用变量count记录当前计算的是哪一段地址,当count等于3时(以0表示第一段)就对应计算第四段的数值,如果数值有效则添加到结果中去,否则返回;如果count为0,1,2则需要通过循环依次尝试截取1,2,3个字符作为当前段的数值,只在数值有效时才递归计算下一段。
整个流程不好描述,建议结合下面我的代码理解整个解题思想。

其他思路:

通过之后看了一下其他大神的解法,除了递归,还有更直接暴力的方法,用四重循环进行判断,因为每一段的字符只能是1-3个,所以利用循环枚举所有可能的组合再保存正确的结果即可。见下面的其他代码。


代码

我的代码:

class Solution {
public:
    void dfs(vector<string> &result, string &s, string temp, int start, int count) {
        string sub = "";

        if (count == 3) {
            if (start >= s.length() || s.length() - start > 3)
                return ;

            sub = s.substr(start);
            if (!((sub.size() > 1 && sub[0] == '0') || (atoi(sub.c_str()) > 255))) {
                temp += sub;
                result.push_back(temp);
            }
        } else {
            for (int i = 1; i <= 3 && start + i <= s.length(); i++) {
                sub = s.substr(start, i);
                if (!((sub.size() > 1 && sub[0] == '0') || (atoi(sub.c_str()) > 255))) {
                    dfs (result, s, temp + sub + ".", start + i, count + 1);
                }
            }
        }
    }

    vector<string> restoreIpAddresses(string s) {
        vector<string> result;

        dfs(result, s, "", 0, 0);

        return result;
    }
};

其他代码:

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> ret;
        string ans;

        for (int a=1; a<=3; a++)
        for (int b=1; b<=3; b++)
        for (int c=1; c<=3; c++)
        for (int d=1; d<=3; d++)
            if (a+b+c+d == s.length()) {
                int A = stoi(s.substr(0, a));
                int B = stoi(s.substr(a, b));
                int C = stoi(s.substr(a+b, c));
                int D = stoi(s.substr(a+b+c, d));
                if (A<=255 && B<=255 && C<=255 && D<=255)
                    if ( (ans=to_string(A)+"."+to_string(B)+"."+to_string(C)+"."+to_string(D)).length() == s.length()+3)
                        ret.push_back(ans);
            }    

        return ret;        
    }
};

总结

这道题一开始没有注意到要利用整个字符串,所以wrong了几次,后面才从例子中发现端倪,其实整个题目并不困难,关键是处理好边界以及数值范围的判断,理清楚递归的参数和返回条件就能做出来。
完成了这周的题目,继续去弄课程项目,这几周真是忙得不行,希望快点过去吧,加油加油~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值