[LeetCode] 93、复原IP地址

题目描述

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

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

解题思路

此题最常规的做法是回溯法,但是本题是有“奇技淫巧”的。

  • 回溯法(这种方法必会):就是一般字符串的“回溯”方法,注意剪枝。
    • 首先明确:每段数字的长度只能是1~3。所以我们在每个位置pos取子串的时候,有三种选择。
    • 递归出口:我们已经取了四段数字且此时的pos == str.length(),我们可以在此时“结算”。
    • 剪枝条件:每段数字不能以0开头,且不能大于255
  • 奇技淫巧(枚举,依次循环判断即可)

我的实现

class Solution {
public:
    vector<string> restoreIpAddresses(string str) {
        vector<string> ip;
        length  = str.size();
        if(length < 4)
            return res;
            
        backtracking(str, 0, ip);
        return res;
    }
    
    void backtracking(string &str, int pos, vector<string> &ip){
        if(ip.size() == 4){
            if(pos == str.size()){
                string temp = "";
                for(int i = 0; i <= 3; i++)
                    temp += i == 3? ip[i]: ip[i]+'.';
                res.push_back(temp);
            }
            return;
        }
        
        for(int i = 1; i <= 3; i++){  // 每段数字只能是1~3位
            if(pos + i - 1 < str.size()){
                string temp_str = str.substr(pos, i);
                int temp_num = stoi(temp_str);
                if(to_string(temp_num).size() != i || temp_num > 255)  // 剪枝:数字位数大于1且以0开头, 或者数字大于255
                    continue;
                
                // dfs(回溯)
                ip.push_back(temp_str);
                backtracking(str, pos + i, ip);
                ip.pop_back();  
            }
        }
        
    }
    
private:
    int length;
    vector<string> res;
};
发布了416 篇原创文章 · 获赞 605 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/ft_sunshine/article/details/104055746
今日推荐