Description
百度面试题 现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。 例如: 给出的字符串为"25525522135", 返回["255.255.22.135", "255.255.221.35"]. 要求:空间复杂度 O(n),时间复杂度 O(n!)。 注意:ip地址是由四段数字组成的数字序列,格式如 "x.x.x.x",其中 x 的范围应当是 [0,255]。 有情提示:类似这样的数字00010,只能划分为0.0.0.10,不能划分为00.0.1.0,四个数字不能包含前导0.
输入格式
一个数字字符串。长度小于12.
输出格式
所有可能的IP地址。
输入样例
112211
输出样例
1.1.2.211 1.1.22.11 1.1.221.1 1.12.2.11 1.12.21.1 1.122.1.1 11.2.2.11 11.2.21.1 11.22.1.1 112.2.1.1
思路经历:简单的搜索题,居然做了一个小时,主要是忘记筛选最后一段地址的格式了,调了好久,下次得注意一下,多留点心眼吧
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
/** \brief
*
* \param
* \param
* \return
*int n,m,pd=0,s[100],k=0;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int v[100][100];
char a[100][100];
*/
char s[10005];
int len;
char b[20];
char a[20];
void dfs(string str1,int i,int deep,int len1){
if(deep==3){
if(len-len1<=3){
if(len-len1==1||(len-len1==2&&a[len1]!='0')||(len-len1==3&&a[len1]-'0'<=2&&a[len1]!='0')){//这里也要判断第四段得三种情况
cout<<str1;
for(int i1=len1;i1<len;i1++)
cout<<a[i1];
cout<<endl;
}
}
return;
}
if(len-len1-1>=1)//选完后第四段至少还有一位
dfs(str1+a[i]+'.',i+1,deep+1,len1+1);
if(a[i]!='0'&&len-len1-2>=1)//选完后第四段至少还有一位,选两位的话第一个不能为零
dfs(str1+a[i]+a[i+1]+'.',i+2,deep+1,len1+2);
if(a[i]!='0'&&(a[i]-'0')<=2&&len-len1-3>=1)//选完后第四段至少还有一位,第一个不能大于三
dfs(str1+a[i]+a[i+1]+a[i+2]+'.',i+3,deep+1,len1+3);
}
int main()
{
cin>>a;
string str;
len=strlen(a);
dfs(str,0,0,0);
return 0;
}