您的位置:首页 > 编程语言 > C语言/C++

Restore IP Addresses

2015-03-28 21:49 176 查看
Restore IP Addresses

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:

Given 
"25525511135"
,

return 
["255.255.11.135", "255.255.111.35"]
. (Order does not matter)

解题思路:

注意到ip地址分成四部分,每部分0<=ip<=25,字符串的表示中,还不能是010这种形式。有两种办法,第一种枚举法,枚举每一部分的IP形式,代码如下:

class Solution {
public:
vector<string> restoreIpAddresses(string s) {
int len = s.length();
vector<string> result;
if(len>12 || len < 4){
return result; //不满足的情况
}
//枚举法,最多C(n-1, 3)中情况
for(int i1=1; i1 < 4 && i1 <= len - 3; i1++){
string ip1 = s.substr(0, i1);
if(checkIP(ip1)){
for(int i2 = i1 + 1; i2 < i1 + 4 && i2 <= len - 2; i2++){
string ip2 = s.substr(i1, i2 - i1);
if(checkIP(ip2)){
for(int i3 = i2 + 1; i3 < i2 + 4 && i3 <= len - 1; i3++){
string ip3 = s.substr(i2, i3 - i2);
if(checkIP(ip3)){
string ip4 = s.substr(i3);
if(checkIP(ip4)){
result.push_back(ip1 + "." + ip2 + "." + ip3 + "." + ip4);
}
}
}
}
}
}
}

return result;
}
private:
bool checkIP(string s){
int len = s.length();
if(len > 3 || len == 0){
return false;
}
//高位不能为0
if(s[0] == '0' && len>1){
return false;
}
//不能超过255
int iNumber = 0;
int base = 1;
for(int i=len-1; i>=0; i--){
iNumber += base * (s[i] - '0');
base *= 10;
}
if(iNumber>255){
return false;
}
return true;
}
};这里注意一个问题,每个地方都枚举太麻烦了,倘若有100个ip块,岂不是要手动验证100次?太麻烦了!可以想到回溯法,通过递归进行回溯,具体要解析多少个ip块,通过参数指定。代码如下:

class Solution {
public:
vector<string> restoreIpAddresses(string s) {
int len = s.length();
vector<string> result;
if(len>12 || len < 4){
return result; //不满足的情况
}
partIP(result, 0, 4, "", s);

return result;
}
private:
void partIP(vector<string>& result, int startIndex, int leftNumber, string tempResult, string& s){
int len = s.length();
if(leftNumber <= 0){
return;
}
if(len - startIndex < leftNumber){
return;
}
for(int i=startIndex + 1; i< startIndex + 4 && i <= len ; i++){
string ip = s.substr(startIndex, i - startIndex);
if(checkIP(ip)){
if(leftNumber == 1 && i == len){
result.push_back(tempResult + ip);
}else{
partIP(result, i, leftNumber - 1, tempResult + ip + ".", s);
}
}else{
break;
}
}
}
bool checkIP(string s){
int len = s.length();
if(len > 3 || len == 0){
return false;
}
//高位不能为0
if(s[0] == '0' && len>1){
return false;
}
//不能超过255
int iNumber = 0;
int base = 1;
for(int i=len-1; i>=0; i--){
iNumber += base * (s[i] - '0');
base *= 10;
}
if(iNumber>255){
return false;
}
return true;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ leetcode