LeetCode #93: Restore IP Addresses (復(fù)原IP地址)
題目描述:
給定一個(gè)只包含數(shù)字的字符串,復(fù)原它并返回所有可能的 IP 地址格式。
示例:
輸入: "25525511135"
輸出: ["255.255.11.135", "255.255.111.35"]
解法一:
使用深度優(yōu)先的搜索方法, 在原始的數(shù)字串中一次加 '.' 將數(shù)字串分割, 直到添加了三個(gè) '.' 將數(shù)字串分為四個(gè)部分(每個(gè)部分都能滿足除零外不以零開(kāi)頭, 而且小于 256)
C++代碼:
class Solution {
public:
/*
這個(gè)函數(shù)就是找從 index 開(kāi)始還要添加 n 個(gè) . 的ip 地址
*/
void help(string s, int index, int n, vector<string> &result) {
/*
當(dāng) n 為 0 時(shí)表示不需要添加 . 了,但是需要判斷最后一段是不滿足條件
*/
if (n == 0) {
// 已經(jīng)沒(méi)有剩余的數(shù)字了, 不滿足條件
if (index == s.length()) return;
// 最后一段是0開(kāi)頭, 但是剩余不止一個(gè)數(shù)字也不滿足條件
if (s[index] == '0' && index != s.length() - 1) return;
// 最后一段滿足條件,添加到結(jié)果數(shù)組里面
if (stoi(s.substr(index)) < 256) result.push_back(s);
return;
}
// 當(dāng) n 比 0 大,還需要繼續(xù)在后面的數(shù)字串里面添加 .
// 如果當(dāng)前數(shù)字為 0 , 直接在后面添加 . , 遞歸調(diào)用
if (s[index] == '0') {
s.insert(index + 1, 1, '.');
help(s, index + 2, n - 1, result);
return;
}
// 用一個(gè)臨時(shí)的 string temp 拷貝當(dāng)前的 string , 保證回溯的時(shí)候能夠還原 string
string temp;
int len = s.length();
// 當(dāng) index 處的數(shù)字不是 0 時(shí), 可以在 index 所指的數(shù)字后零個(gè)一個(gè)兩個(gè)數(shù)字后添加 .
for (int i = index; i < len - 1 && (i - index + 1) <= 3; i++) {
temp = s;
// 大于 256 就不滿足 ip 地址每一段的條件了
if (stoi(temp.substr(index, i-index+1)) > 256) continue;
// 滿足條件, 添加 .
temp.insert(i+1, 1, '.');
// 繼續(xù)添加后面的 .
help(temp, i+2, n-1, result);
}
}
vector<string> restoreIpAddresses(string s) {
vector<string> result;
if (s.length() > 12 || s.length() < 4) return result;
help(s, 0, 3, result);
return result;
}
};