Leetcode-93 復原IP地址

忙碌但是莫名其妙的六月,終於又可以刷題了,六月六月慢一點…

DFS

dfs(string s,string tmp,int word)
s是剩餘需要分割的字符串 tmp是已經分割好的字符串 word是已經分割出的ip地址數目,用於結束遞歸,確定正確結果

class Solution {
public:
    vector<string> res;
    vector<string> restoreIpAddresses(string s) {
        string tmp;
        dfs(s,tmp,0);
        return res;
    }
    void dfs(string s,string tmp,int word)
    {
        if(word>4)return;
        if(word==4&&s=="")
            res.push_back(tmp);
        else
        {
            if(tmp!="") tmp+='.';
            for(int i=1;i<=3&&i<=s.size();i++)
         {   
            if(valid(s.substr(0,i)))
            {
                string t=tmp+s.substr(0,i);
                dfs(s.substr(i,s.size()-i),t,word+1);
            }
         }
        }
    }

    bool valid(string str)
    {
        if(str.size()==1)
            return true;
        if(str.size()==0||str[0]=='0')
            return false;
        int num=atoi(str.c_str());
        if(num>=0&&num<=255)
            return true;
        else
            return false;
    }
};

回溯算法

其實dfs也是一個大樹往下遞歸延展。

如果把for循環中的重新創建字符串t這個操作改爲【進入循環tmp改變-->dfs-->tmp變回原樣-->循環】就是熟悉的回溯算法啦

            for(int i=1;i<=3&&i<=s.size();i++)
         {   
            if(valid(s.substr(0,i)))
            {
                string t=tmp+s.substr(0,i);
                dfs(s.substr(i,s.size()-i),t,word+1);
            }
         }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章