有效 IP 地址 正好由四个整数(每个整数位于 0
到 255
之间组成,且不能含有前导 0
),整数之间用 '.'
分隔。
- 例如:
"0.1.2.201"
和 "192.168.1.1"
是 有效 IP 地址,但是 "0.011.255.245"
、"192.168.1.312"
和 "192.168@1.1"
是 无效 IP 地址。
给定一个只包含数字的字符串 s
,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s
中插入 '.'
来形成。你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
1 2
| 输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"]
|
示例 2:
1 2
| 输入:s = "0000" 输出:["0.0.0.0"]
|
示例 3:
1 2
| 输入:s = "101023" 输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
|
提示:
1 <= s.length <= 20
s
仅由数字组成
解题思路
关键点在于回溯中要通过pointNum判断小数点的数量,pointNum == 3,说明分割完毕,然后判断小数点后的字符串是否合法

代码
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 41 42 43 44 45
| class Solution { List<String> ans = new ArrayList<>();
public List<String> restoreIpAddresses(String s) { StringBuilder sb = new StringBuilder(s); traversal(sb, 0, 0); return ans; }
public void traversal(StringBuilder s, int l, int pointNum){ if(pointNum == 3){ String sub = s.substring(l); if(isValidAdd(sub)){ ans.add(s.toString()); } return; }
for(int r = l ; r < s.length(); r++){ String sub = s.substring(l, r + 1); if(!isValidAdd(sub)){ continue; } s.insert(r + 1,'.'); traversal(s, r + 2, pointNum + 1); s.deleteCharAt(r + 1); } } public boolean isValidAdd(String s){ if(s.length() == 0){ return false; } if(s.length() != 1 && s.charAt(0) == '0' ){ return false; } if(s.length() > 3){ return false; } int num = Integer.parseInt(s); return num <= 255 && num >= 0; } }
|
不使用StringBuilder的写法
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| class Solution { List<String> res = new ArrayList<>();
public List<String> restoreIpAddresses(String s) { backtracking(s, 0, 0); return res; }
public void backtracking(String s, int index, int pointNum){
if(pointNum==3){ if(index <= s.length()-1 && s.length()-index <= 3){ if(isVaildIp(s, index, s.length()-1)){ res.add(s); } } return; }
for(int i = index ; i<s.length()&&i-index<3 ;i++){ if(isVaildIp(s,index,i)){ s = s.substring(0,i+1) + "." + s.substring(i+1); pointNum++; backtracking(s,i+2,pointNum); pointNum--; s = s.substring(0,i+1) + s.substring(i+2); } } } private boolean isVaildIp(String s, int start, int end) { if (s.charAt(start) == '0' && end+1-start>1) { return false; } int num = 0; for(int i = start; i<=end; i++){ if(s.charAt(i)>'9'||s.charAt(i)<'0'){ return false; } num = num*10+(s.charAt(i)-'0'); if(num>255){ return false; } } num = Integer.parseInt(s.substring(start,end+1)); if(num<0||num>255){ return false; } return true; } }
|