题目:
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)
题目来源:https://oj.leetcode.com/problems/restore-ip-addresses/
解题思路:回溯法,如果当前数字不合理,就返回重新选择’.’的位置,如果最后一次剩下的数字>255则也需要返回重新选择。
注意:每个段的数字在0-255之间,如果这个数>0,则第一个字符不能为0,这是IP地址的规定。
#include<iostream>
#include <vector>
using namespace std;
void restoreIpAdd(vector<string> &result,string s,int index,int remain)
{
if(remain==0)
{
char ch[10]={'\0'};
int k=0;
for(int i=index;i<s.size();i++)
ch[k++]=s[i];
if(k>1 && ch[0]=='0')//如果当前值>1则第一位不能是0
return ;
if(ch[0]!='\0' && atoi(ch)<=255)
result.push_back(s);
return ;
}
string ch;
for(size_t i=index;i<s.size();i++)
{
if(i-index>2)//每段最多有3位
return ;
ch.push_back(s[i]);
if(ch.size()>1 && ch[0]=='0')//如果当前值>1则第一位不能是0
return ;
if(atoi(ch.c_str())<=255)//值必须<255才是一个真正的段
{
s.insert(s.begin()+i+1,'.');
restoreIpAdd(result,s,i+2,remain-1);
s.erase(s.begin()+i+1);
}
}
}
vector<string> restoreIpAddresses(string s)
{
vector<string> result;
if(s.size()<4 || s.size()>12)
return result;
restoreIpAdd(result,s,0,3);//有且仅有有3个点
return result;
}
int main()
{
string s="000256";
vector<string> result=restoreIpAddresses(s);
system("pause");
return 0;
}