题目:
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>