1. 题意
给一个只包含数字的字符串,将它还原成合法的IP串。
复原IP地址
2. 题解
回溯列举所有的字符串可能,对长度和数值进行剪枝。
- 代码
class Solution {
public:
bool isValidSec(string &str, int len)
{
if ( len > 3 || len < 1)
return false;
int ans = 0;
if (str[0] == '0' && len > 1)
return false;
for (int i = 0; i < len; ++i ) {
ans = ans * 10 + (str[i] - '0');
}
return ans <= 255;
}
void fun(string s, string &cur, vector<string> &res, int depth)
{
if (depth == 4) {
res.push_back(cur);
return ;
}
int sz = s.size();
if ( sz < 4 - depth || sz > (4 - depth) * 3)
return ;
int len = 1;
if ( depth == 3)
len = sz;
for ( ; len <= sz; ++len ) {
string tmp(s, 0, len);
if ( isValidSec(tmp, len)) {
cur.append(tmp);
if (depth < 3)
cur.push_back('.');
fun(s.substr(len, s.size() - len), cur, res, depth + 1);
if (depth < 3)
cur.pop_back();
for (int j = 0; j < len; ++j)
cur.pop_back();
}
}
}
vector<string> restoreIpAddresses(string s) {
vector<string> res;
vector<int> vis(res.size(), 0);
string cur;
fun(s, cur, res, 0);
return res;
}
};