数字字符串转化为IP地址
牛客链接 <–
题目描述
现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
例如:
给出的字符串为"25525511135",
返回[“255.255.11.135”, “255.255.111.35”]. (顺序没有关系)
输入:
“25525511135”
输出
[“255.255.11.135”,“255.255.111.35”]
函数接口规定:
class Solution {
public:
/**
*
* @param s string字符串
* @return string字符串vector
*/
vector<string> restoreIpAddresses(string s) {
//write your code here
}
};
这个题目之前面试的时候遇到过,还是要考虑一些情况的。首先要dfs,把字符串分隔成4部分,因为IPv4是32位的,用点分十进制分成a.b.c.d的形式,每个十进制数都要在[0,255]的范围内。所以我们dfs的时候,可以先保证每个数的位数在1到3之间。
dfs出分割后,要判断这个十进制数是否合法。如果是空串一定不行,如果有前导零也不行,大于255也不行。
class Solution {
public:
/**
*
* @param s string字符串
* @return string字符串vector
*/
string tmp;
int r[4];
int ok(string s) { //判断十进制串是否合法
if(!s.length()) return -1; //空串
if((int)s.length()>1 && s[0]=='0') return -1; //有前导零
int ans = 0;
for(int i=0;i<(int)s.length();++i) {
ans = ans * 10 + s[i]-'0';
}
if(ans>255) ans = -1;
return ans;
}
string judge() { //判断这种分隔方案是否可行
string a = tmp.substr(0,r[1]+1);
string b = tmp.substr(r[1]+1,r[2]-r[1]);
string c = tmp.substr(r[2]+1,r[3]-r[2]);
string d = tmp.substr(r[3]+1);
string res = "#";
if(ok(a)!=-1 && ok(b)!=-1 && ok(c)!=-1 && ok(d)!= -1) {
res = a+"."+b+"."+c+"."+d;
}
return res;
}
void dfs(int x,vector<string>& vans) {
if(x==4) {
string res = judge();
if(res!=string("#")) vans.push_back(res);
return;
}
for(int i=1;i<=3;++i) {
if(r[x-1]+i>=(int)tmp.length()) return; //后面的串分配不到字符了
r[x] = r[x-1]+i;
dfs(x+1,vans);
}
}
vector<string> restoreIpAddresses(string s) {
tmp = s;
vector<string> ans;
r[0] = -1;
dfs(1,ans);
return ans;
}
};
用r[]记录每个字符串最后一个元素在原串中的下标。然后对于dfs出的每个方案,判断四个子串的合法性,若合法,就记录。