93. Restore IP Addresses
一、题目
1、审题
2、分析
给一个只含有数字的字符串,判断其拆分后满足正确 IP 地址格式的所有组合。
二、解答
1、思路:
每个 IP 地址的一项均为 0 ~ 255之间,用 1~3 位数值进行表示,故可以将字符串拆分成四项,且每一项长度为 1~3,再依次判断每项是否为 0 ~ 255 之间,满足即返回。
利用 三个 for 循环进行字符串的拆分,将所有满足的拆分式返回。
public List<String> restoreIpAddresses(String s) { List<String> resultList = new ArrayList<String>(); int len = s.length(); if(len < 4 || len > 12){ return resultList; } for (int i = 1; i < 4 && i < len - 2; i++) { // i 长度 为 1-3, 且剩余长度 >= 3 for (int j = i+1; j < i+4 && j < len - 1; j++) { // j 长度为 1-3 , 且剩余长度 >= 2 for(int k = j+1; k < j+4 && k < len; k++){ String s1 = s.substring(0, i); String s2 = s.substring(i, j); String s3 = s.substring(j, k); String s4 = s.substring(k, len); if(isValid(s1) && isValid(s2) && isValid(s3) && isValid(s4)) resultList.add(new StringBuffer() .append(s1).append('.') .append(s2).append('.') .append(s3).append('.') .append(s4).toString() ); } } } return resultList; } private boolean isValid(String s2) { if((s2.length() > 1 && s2.charAt(0) == '0') || Integer.parseInt(s2) > 255) return false; return true; }
优化,利用三个循环直接控制前三个子字符串的长度。更直观
public List<String> restoreIpAddresses(String s) { List<String> resultList = new ArrayList<String>(); int len = s.length(); if(len < 4 || len > 12){ return resultList; } for (int a = 1; a <= 3; a++) for (int b = 1; b <= 3; b++) for (int c = 1; c <= 3; c++) { int d = len - a - b - c; if(1 <= d && d <= 3) { String s1 = s.substring(0, a); String s2 = s.substring(a, a+b); String s3 = s.substring(a+b, a+b+c); String s4 = s.substring(a+b+c, len); if(isValid(s1) && isValid(s2) && isValid(s3) && isValid(s4)) resultList.add(new StringBuffer() .append(s1).append('.') .append(s2).append('.') .append(s3).append('.') .append(s4).toString() ); } } return resultList; } private boolean isValid(String s2) { if((s2.length() > 1 && s2.charAt(0) == '0') || Integer.parseInt(s2) > 255) return false; return true; }