标签:add html res ipaddress || 一个 nbsp blog for
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
题目要求将一串只包含数字的字符串分割成合法的IP码。要求求出所有可能的情况,所以使用递归法进行求解。
相当于将长字符串分割成4个小字符串,每个小字符串均符合IP地址的格式。IP地址格式要求:
子字符串的长度要>0且<=3
使用标志k记录当前所得的子字符串个数。当满足有4个子字符串并且s中的字符全部用到了,就得到了一个合法的IP地址,将其放入res中。
每个子字符串的长度均为1~3,合法子字符串中间加.进行分割,最后一个子字符串后边不用加.
代码如下:
class Solution { public: vector<string> restoreIpAddresses(string s) { vector<string> res; restore(s,4,"",res); return res; } void restore(string s,int k,string out,vector<string> &res){ if(k==0){ if(s.empty())res.push_back(out); } else{ for(int i=1;i<=3;++i){ if(s.size()>=i && isValid(s.substr(0,i))){ if(k==1)restore(s.substr(i),k-1,out+s.substr(0,i),res); else restore(s.substr(i),k-1,out+s.substr(0,i)+".",res); } } } } bool isValid(string s){ if(s.empty() || s.size()>3 || (s.size()>1 && s[0]==‘0‘))return false; int res=atoi(s.c_str()); return res>=0 && res<=255; } };
也可以将判断子字符串是否合法的函数用条件语句代替。其中,判断字符串前边是否有0的语句为:
i != std::to_string(val).size()
意思是当前子字符串的长度是否和该字符串转为整型再转为字符串后的长度一致,如果不一致就表明不合法。例如:当i=3,子字符串为"010",子字符串转为整型变成10,再转为字符串变成"10",长度比3小,因此该字符串不合法。
代码如下:
class Solution { public: vector<string> restoreIpAddresses(string s) { vector<string> res; restore(s, 4, "", res); return res; } void restore(string s, int k, string out, vector<string> &res) { if (k == 0) { if (s.empty())res.push_back(out); } else { for (int i = 1; i <= 3; ++i) { if (s.size() < k)break; int val = atoi(s.substr(0, i).c_str()); if (val > 255 || i != std::to_string(val).size())continue; restore(s.substr(i), k - 1, out + s.substr(0, i) + (k > 1 ? "." : ""), res); } } } };
参考:https://www.cnblogs.com/grandyang/p/4305572.html
[LeetCode] 93. Restore IP Addresses
标签:add html res ipaddress || 一个 nbsp blog for
原文地址:https://www.cnblogs.com/cff2121/p/10861363.html