本题源自LeetCode
-------------------------------------------------------------------
用三重循环遍历字符串,每个段的长度不能超过三,
java代码:
public ArrayList<String> restoreIpAddresses(String s) {
ArrayList<String> result=new ArrayList<String>();
int len=s.length();
for(int i=1;i<4&&i<len-2;i++){
for(int j=i+1;j<i+4&&j<len-1;j++){
for(int k=j+1;k<j+4&&k<len;k++){
if(len-k>=4) //判断字符串 是否有剩余
continue;
int a=Integer.parseInt(s.substring(0,i));
int b=Integer.parseInt(s.substring(i,j));
int c=Integer.parseInt(s.substring(j,k));
int d=Integer.parseInt(s.substring(k));
if(a>255||b>255||c>255||d>255)
continue;
String ip=a+"."+b+"."+c+"."+d;
if(ip.length()<len+3)
continue;
result.add(ip);
}
}
}
return result;
}
C++代码 :
vector<string> restoreIpAddresses(string s) {
vector<string> result;
string t; //存每次子串的结果
DFS(t,s,result,0);
return result;
}
void DFS(string t,string s,vector<string>& result,int count){
if(count==3&&isValid(s)){
result.push_back(t+s);
return;
}
for(int i=1;i<4&&i<s.size();i++){
string sub=s.substr(0,i); //取子串
if(isValid(sub)){
DFS(t+sub+".",s.substr(i),result,count+1);
}
}
}
bool isValid(string s){
stringstream ss;
int num;
ss<<s;
ss>>num;
if(s.size()>1){ //如果数字长度大于1 ,则首位不能是0;
return s[0]!='0'&&num>=0&&num<256;
}
return num>=0&&num,256;
}