算法訓練: Restore IP Addresses

題目鏈接:https://leetcode.com/problems/restore-ip-addresses/?tab=Description

題目描述:

       給一個只包含數字的字符串,要求返回所有合法的IP地址。

       例: 給定字符串爲 "25525511135" ,需要返回["255.255.11.135", "255.255.111.35"](順序無關)

解題思路:

      採用一種深度優先遍歷的思想,得到所有的組合。

      對於給定的字符串,每次取字符的一個、兩個或者三個字符串,f轉換成整型(“255”變爲255),判斷該整型值是否在小於256,

若是,對剩下的字符串採用同樣的方法進行遍歷,直到遍歷到字符串的最後並且符合合法IP地址的形式,則返回,如果該整型值大

於256,則跳過該種情況。

       legalIP的參數:s表示輸入的字符串,startindex表示每段遍歷的起始地址,step合法IP地址遍歷次數,等於4則表示遍歷結束,

currenip表示當前遍歷時IP地址,res爲保存合法IP地址的數組。

void legalIP(string s, int startindex, int step, string currentip, vector<string>&res){
        int len=s.size();
        int sum=0;
        //判斷字符串的長度是否合法
        if((len-startindex)>(12-step*3)) return;
        if((len-startindex)<(4-step)) return;
        //判斷字符串的長度合法,且遍歷到了最後,得到一個合法IP地址
        if(len==startindex&&step==4){
            res.push_back(currentip);
            return;
        }
        //以三個字符爲一組,如果小於256,則參與遞歸
        for(int i=startindex; i<startindex+3 && i<len; i++){
           sum=sum*10+s[i]-'0';
           if(sum<=255){
               currentip=currentip+s[i];
               if(i<len-1) legalIP(s, i+1, step+1, currentip+'.',res);
               else legalIP(s, i+1, step+1, currentip,res);//遍歷到最後,不加'.'
           }
           else return;//大於255即結束遍歷返回
           if(sum==0) return;//避免前綴爲0
       } 
        
    }
    vector<string> restoreIpAddresses(string s) {
        vector<string> result;
        string currentip;
        legalIP(s,0,0,currentip,result);
        return result;
    }

結果:     

Your Input
"322000"
Your answer
["3.2.200.0","3.220.0.0","32.20.0.0"]
Expected answer
["3.2.200.0","3.220.0.0","32.20.0.0"]



   










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章