題目鏈接: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"]