有效 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:
| 12
 
 | 输入:s = "25525511135"输出:["255.255.11.135","255.255.111.35"]
 
 | 
示例 2:
| 12
 
 | 输入:s = "0000"输出:["0.0.0.0"]
 
 | 
示例 3:
| 12
 
 | 输入: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,说明分割完毕,然后判断小数点后的字符串是否合法

代码
| 12
 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的写法
| 12
 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;
 }
 }
 
 |