Leetcode 93. 复原IP地址

93. 复原IP地址

解题思路:

典型的dfs+回溯的题:挨个判断所有的字符串类型组合,符合题意则加入最后的vector否则退出递归;
这里说一下几个点,首先,dfs传入的此一个参数,是剩下的数字字符串,使用stoi的时候,要防止结果溢出,我们知道ipv4地址的每一项最多3位,所以,当前字符串超过三位之后,直接return,在for循环中也是一样,截取的字符串长度超过3,直接break;
还有注意测试用例: “010010” ,也就是说stoi会直接忽略掉前置0,比如010,会直接转换为10,最后造成错误,我们直到ipv4地址,如果第一个字符为0,则只可能是单个数字0,所以我们只要加上str[0] == '0' && str.length() > 1的判断,即可找出类似010这种组合,直接排除即可。

源代码:
class Solution {
private:
    vector<string> res;
public:
    void dfs(string str, int index, string path){
        long long tmp;
        if(str == "") return;
        if(index == 4){
            if(str.length() > 3) return;
            long long tmp = stoi(str);
            if(tmp > 255 || (str[0] == '0' && str.length() > 1)) return;
            path += str;
            res.push_back(path);
        }
        int i;
        for(i=1;i<=str.length();i++){
            string tmp_chars = str.substr(0, i);
            if(i > 3) break;
            if(stoi(str.substr(0, i)) > 255 || (tmp_chars[0] == '0' && tmp_chars.length() > 1)) break;
            string tmp_str = path;
            path += str.substr(0, i);
            path += ".";
            dfs(str.substr(i, str.length() - i + 1), index+1, path);
            path = tmp_str;
        }
    }
    vector<string> restoreIpAddresses(string s) {
        if(s == "") return res;
        string tmp_path = "";
        dfs(s, 1, tmp_path);
        return res;
    }
};

你可能感兴趣的:(leetcode随笔)