ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

93. 复原 IP 地址

2022-04-02 19:01:57  阅读:147  来源: 互联网

标签:子串 return temp IP startIndex str 93 复原 size


✅做题思路or感想

这种字符串切割的问题都可以用回溯法来解决

递归三部曲:

  • 递归参数

    • 因为要切割字符串,所以要用一个startIndex来控制子串的开头位置,即是会切割出一个范围是[startIndex, i]的子串
  • 递归中止条件

    • 这里因为IP地址有正好四个整数(子串)构成,所以当切割的子串数量为4时就可以了。然后因为这四个子串组合起来要正好是主串,所以还需要startIndex超过主串的最后一位,即s.size() - 1才行
  • 递归单层逻辑

    • 判断子串是否符合条件,符合后便把子串放入vector<string>
  • 判断条件

    1. 不能有前导0
    2. 子串长度不超过3
    3. 不能有除了数字外的其他字符
    4. 子串转化成的数字范围要在[0, 255]
class Solution {
public:
    vector<string>result;
    vector<string>temp;
    bool isGood(string s, int startIndex, int i) {
        //子串长度限制
        if (i - startIndex + 1 >= 4)return false;
        string str = s.substr(startIndex, i - startIndex + 1);
        //由子串转化成的数字的范围的限制
        if (0 > stoi(str) || stoi(str) > 255)return false;
        //前导0的限制
        if (str.size() > 1 && str[0] == '0')return false;
        //非法字符的限制
        for (int j = 0; j < str.size(); j++) {
            if (str[j] >= '0' && str[j] <= '9')continue;
            else return false;
        }
        return true;
    }
    void dfs(string s, int startIndex) {
        //递归中止条件
        if (temp.size() == 4 && startIndex >= s.size()) {
            string str;
            //需要把子串拿出来做一点加工后再放到result中!!!
            for (int i = 0; i < temp.size(); i++) {
                if (i != temp.size() - 1) {
                    str = str + temp[i] + ".";
                } else {
                    str = str + temp[i];
                }
            }
            result.push_back(str);
            return;
        }
        for (int i = startIndex; i < s.size(); i++) {
            if (isGood(s, startIndex, i)) {
                string str = s.substr(startIndex, i - startIndex + 1);
                temp.push_back(str);
                dfs(s, i + 1);
                temp.pop_back();	//回溯
            } 
        }
    }
    vector<string> restoreIpAddresses(string s) {
        dfs(s, 0);
        return result;
    }
};

标签:子串,return,temp,IP,startIndex,str,93,复原,size
来源: https://www.cnblogs.com/doomaa/p/16093589.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有