题目:
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"]
.
这道题采用深度搜索的方法实现。深度搜索主要需要注意的是:
回溯剪枝的条件:
s.size()-start>(4-step)*3 //表明字符长度大于最大数
s.size()-start<(4-step) //表明字符长度小于最小数
s.size() == start && step == 4 //表明一个完整的路径生成
获得路径:
C++ Code
1
2 3 4 5 6 7 |
num = num *
10 + (s[i] -
'0');
if(num <= 255) { ip += s[i]; search(s, ans, step + 1, ip + '.', i + 1); } if(num == 0) break; |
下面的是代码实现如下:
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
class Solution
{ public: vector<string> restoreIpAddresses(string s) { vector<string> ans; if(s.size() > 3 * 4) return ans; search(s , ans, 0, "", 0); return ans; } void search( const string &s , vector<string> &ans , int step , string ip , int start) { if(s.size() == start && step == 4) { ip.resize(ip.size() - 1); ans.push_back(ip); return ; } if(s.size() - start > ( 4 - step) * 3) return ; if(s.size() - start < ( 4 - step)) return ; int num = 0; for( int i = start; i < start + 3; ++i) { num = num * 10 + (s[i] - '0'); if(num <= 255) { ip += s[i]; search(s, ans, step + 1, ip + '.', i + 1); } if(num == 0) break; } } }; |