题目
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)
题目大意
就是给你一个字符串,返回能分割成的ip组合,返回为一个字符串数组,数组顺序无所谓。
解题思路
- ip的特点
- 除去点,最长12个字符。
- 每一段最长三个字符
- 每一段不能大于255,手字符不能为0
- 特殊case "0000","10000100"
代码片段
List<String> res = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
if (s.length() > 12 || s.length() < 4) {
return res;
}
ipHelper(s, 0, new ArrayList<>());
return res;
}
/**
* @param s 街衢对应段之后段字符串
* @param count 正在计算的段,0,1,2,3
* @param list 中间结果
*/
private void ipHelper(String s, int count, List<String> list) {
/*不是最后一段的时候*/
if (count != 3) {
/*最小的是后面每段都是3,他这边最少得取的值,下限是1*/
int low = s.length() - (3 - count) * 3 > 1 ? s.length() - (3 - count) * 3 : 1;
/*最大的是后面每段都是1,他这边最多得取的值,上线是3*/
int up = s.length() - (3 - count) < 3 ? s.length() - (3 - count) : 3;
if (low > up) {
return;
}
for (int i = low; i <= up; i++) {
String s1 = s.substring(0, i);
Integer value1 = Integer.parseInt(s1);
/*抛弃连续0的情况*/
if (i > 1 && s1.startsWith("0")) {
return;
}
/*兼容0.0.0.0的情况*/
if (value1 < 0 || value1 > 255) {
/*不符合生成条件*/
return;
}
list.add(s1);
ipHelper(s.substring(i), count + 1, list);
list.remove(count);
}
} else {
if (s.length() > 3) {
/*不符合规则*/
return;
}
Integer value1 = Integer.parseInt(s);
if (s.length()>1 && s.startsWith("0")) {
return;
}
/*兼容0.0.0.0的情况*/
if (value1 < 0 || value1 > 255) {
/*不符合生成条件*/
return;
}
list.add(s);
res.add(String.join(".", list));
list.remove(count);
}
}
leetcode上耗时比较少的方案
class Solution {
// 3 dots, 4 num; 0<=num<=255 with no leading zeros
public List<String> restoreIpAddresses(String s) {
List<String> validAddresses = new ArrayList<>();
// use for to split string into 4 substring, check each one is valid or not, not start with 0 and < 255
// if every substring is valid, record answer
for (int i=1;i<s.length() && i<4;i++){
if (isValid(s.substring(0,i))){
for (int j=i+1;j<s.length() && j<i+4;j++){
if (isValid(s.substring(i,j))){
for (int k=j+1;k<s.length() && k<j+4;k++){ //bug
if (s.length()-k>3) continue; // bug
if (isValid(s.substring(j,k)) && isValid(s.substring(k))){
StringBuilder sol=new StringBuilder();
sol.append(s.substring(0,i)).append(".").append(s.substring(i,j)).append(".")
.append(s.substring(j,k)).append(".").append(s.substring(k));
validAddresses.add(sol.toString());
}
}
}
}
}
}
return validAddresses;
}
private boolean isValid(String s){
if (s.charAt(0)=='0' && s.length()>1) return false;
if (Integer.parseInt(s) > 255) return false;
return true;
}
}