题目:
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given "25525511135"
,
return ["255.255.11.135", "255.255.111.35"]
. (Order does not matter)
新函数:
stoi : 将字符串转换为数字;
int stoi (const string& str, size_t* idx = 0, int base = 10); int stoi (const wstring& str, size_t* idx = 0, int base = 10);
atoi: 字符数组转int
int atoi (const char * str);
Attention:
1. 在验证字符串是否是数字的时候,要注意0的情况,001,010,03都是非法的。所以,如果第一位取出来是0,那么我们就判断字符串是否是"0",不是的情况都是非法的
2. 取字符串的时候,注意位数不够的问题,不仅<4, 而且<s.length()
3. 注意substring的范围
4. 字符串转换成数字 stoi;
5. 别忘了IP 地址里面的 "."
6. 到第4个Part的时候我们就可以整体验证剩下的所有字符串(因为第4个Part最后一定要取到结尾才是正确的字符串)
7.注意当切割到最后一个部分时,添加ip字符串的方式不一样,不需要“.”
AC Code:
<span style="font-size:14px;">class Solution {
public:
vector<string> restoreIpAddresses(string s) {
//采用递归 + 判断有效性 增加两个函数
vector<string> ret;
if(s.length() < 4 || s.length() > 12) return ret;
int strlen = s.length();
restoreIpAddresses_helper(s, "", ret, 1);
return ret;
}
private:
void restoreIpAddresses_helper(string s, string tmp, vector<string>& ret, int segment){
//s代表字符串剩余未切割的数字,tmp代表目前已分割好的IP, segment代表当前分割到IP第几个部分
//如果分割了四个部分数字,结束本次查询递归。
if(segment == 4 && isValid(s))
{
ret.push_back(tmp + s);
return;
}
for(int i = 1; i < 4 && (i < s.length()); i++)
{
string substr = s.substr(0, i);
if(isValid(substr))
{
int strlen = s.length();
restoreIpAddresses_helper(s.substr(i, strlen - i), tmp + substr + '.' , ret, segment + 1);
}
}
}
bool isValid(string str){
//注意:数据太大会领导i溢出,所以别忘记加判断s.length()>3
if(str.length() == 0 || str.length() > 3) return false;
//注意:01,02,033等情况,但是0是合法的
if(str[0] == '0' && str.length() > 1) return false;
//因为stoi只能是转换成为int大小,超过INT_MIN INT_MAX就会溢出
int num = std::stoi(str);
if(num >= 0 && num <= 255)
{
return true;
}
else
{
return false;
}
}
};</span>