dfs递归枚举每个点分片段的数字是否合法
class Solution { public: bool isValid(string ip) { int val = stoi(ip); if (val > 255) return false; if (ip.size() >= 2 && ip[0] == '0') return false; return true; } void dfs(string& s, int pos, vector<string> &path, vector<string>& res) { //首先判断剩余的位数,是不是还能满足要求,比如25525511135,若2.5.5.25511135显然不满足,这可以预判 int maxLen = (4 - path.size()) * 3; if (s.size() - pos > maxLen) return; //递归出口 if (path.size() == 4 && pos == s.size()) { string ans = ""; for (int i = 0; i < 4; ++i) { ans += path[i]; if (i != 3) ans += "."; } res.push_back(ans); return; } //一个片段最多包含三个字符 for (int i = pos; i < s.size() && i <= pos + 2; ++i) { string ip = s.substr(pos, i - pos + 1); //判断提取的字符片段是否合法 if (!isValid(ip)) continue; path.push_back(ip); dfs(s, i + 1, path, res); //回溯、删除最后一个元素 path.pop_back(); } } vector<string> restoreIpAddresses(string s) { //找3个.的位置,每个.之前组成的的数值必须要小于255,且以0开头的除非数字是0本身,否则也是非法 vector<string> res; if (s.size() == 0 || s.size() < 4) return res; //path保存分成四组的字符串 vector<string> path; dfs(s, 0, path, res); return res; } };