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;
}
};