问题描述 :
给定一个只包含数字的字符串,复原它(在中间插入点号)并返回所有可能的 IP 地址格式,输出可能的格式的数量。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间)组成,整数之间用 ‘.’ 分隔。
示例:
输入: “25525511135”
输出: 2
说明:因为可能的IP地址包括:[“255.255.11.135”, “255.255.111.35”]
输入说明 :
输入一个只包含数字的字符串
输出说明 :
输出一个整数
输入范例 :
25525511135
输出范例 :
2
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<string> res;
bool vail(int left,int right,string &s){
int sum=0;
for(int i=left;i<=right;i++){
if(left!=right&&s[left]=='0'){
return false;
}
sum=sum*10+(s[i]-'0');
if(sum>255){
return false;
}
}
return true;
}
void helper(int n,int pointnum,int lastpoint,string &cur,string &s){
if(pointnum==3){//已经加入了三个.号
if(vail(lastpoint+1,n-1,s)){//判断最后剩下的字符是否满足
res.push_back(cur);
}
return ;
}
for(int i=lastpoint+1;i<n-1;i++){
if(vail(lastpoint,i,s)){
cur.insert(cur.begin()+i+pointnum+1,'.');
helper(n,pointnum+1,i,cur,s);
cur.erase(pointnum+i+1,1);
//pointnum--;
}
}
return ;
}
vector<string> restoreIpAddresses(string s){
int n=s.size();
string cur=s;
helper(n,0,-1,cur,s);
return res;
}
int main(){
string s;
cin>>s;
vector<string> res=restoreIpAddresses(s);
cout<<res.size();
return 0;
}