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;}
};