題目
給定一個只包含數字的字符串,復原它並返回所有可能的 IP 地址格式。
示例:
輸入: “25525511135”
輸出: [“255.255.11.135”, “255.255.111.35”]
來源:力扣(LeetCode)
思路
兩個經驗:第一,凡是字符串的子序列或配準問題應考慮動態規劃DP,第二,需要求出所有可能情況首先考慮用遞歸。
首先,這道題符合第二種情況,所以我們要用遞歸來解;
用k來表示當前還需要分的段數,如果k = 0,則表示三個點已經加入完成,四段已經形成,若這時字符串剛好爲空,則將當前分好的結果保存;
其次,若k != 0, 則對於每一段,我們分別用一位,兩位,三位來嘗試,分別判斷其合不合法,如果合法,則調用遞歸繼續分剩下的字符串;
最後,和求出所有合法組合。
C++代碼
class Solution {
public:
vector<string> restoreIpAddresses(string s)
{
vector<string> res;
restore(s, 4, "", res);
return res;
}
void restore(string s, int k, string out, vector<string> &res)
{
if (k == 0)
{
if (s.empty())
res.push_back(out);
}
else
{
for (int i = 1; i <= 3; ++i)
{
if (s.size() >= i && isValid(s.substr(0, i)))
{
if (k == 1)
restore(s.substr(i), k - 1, out + s.substr(0, i), res);
else
restore(s.substr(i), k - 1, out + s.substr(0, i) + ".", res);
}
}
}
}
bool isValid(string s)
{
if (s.empty() || s.size() > 3 || (s.size() > 1 && s[0] == '0'))
return false;
int res = atoi(s.c_str());
return res <= 255 && res >= 0;
}
};