&LeetCode0093& 復原IP地址

題目

給定一個只包含數字的字符串,復原它並返回所有可能的 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章