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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章