/**
-
@author xin麒
-
@date 2022/12/14
-
有效 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:输入:s = “25525511135” 输出:[“255.255.11.135”,“255.255.111.35”]
-
示例 2:输入:s = “0000” 输出:[“0.0.0.0”]
-
示例 3:输入: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 仅由数字组成
*/
class Solution {
List res = new ArrayList<>();
StringBuilder builder = new StringBuilder();
char flag = ‘.’;
String s;
public List restoreIpAddresses(String s) {
if (s.length() > 12) return res;
this.s = s;
backTracking(0,0);
return res;
}private void backTracking(int startIndex, int count) {
if (count == 4) {builder.deleteCharAt(builder.length() - 1);//剔除第四个"." if (startIndex != s.length()) return; res.add(builder.toString()); return; } for (int i = startIndex; i < s.length() && i < startIndex + 3; i++) { if (3*(4 - count) < s.length() - i) continue; String str = getStringByI(i,startIndex); if (str == null) return; builder.append(str); builder.append(flag); backTracking(i + 1,count + 1); if (builder.charAt(builder.length() - 1)== flag) builder.deleteCharAt(builder.length() - 1); builder.delete(builder.length() - str.length(),builder.length());//剔除str }
}
char zero = ‘0’;
private String getStringByI(int i, int startIndex) {
if (i > startIndex && s.charAt(startIndex) == zero) return null;String substring = s.substring(startIndex, i + 1); int num = Integer.parseInt(substring); if (num > 255) return null; return substring;
}
}