题解 | #数字字符串转化成IP地址#
数字字符串转化成IP地址
https://www.nowcoder.com/practice/ce73540d47374dbe85b3125f57727e1e
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return string字符串ArrayList */ public ArrayList<String> restoreIpAddresses (String s) { // write code here //先过滤掉不符合条件的 if (s.length() < 4 || s.length() > 12) { return new ArrayList<>(); } StringBuilder sb = new StringBuilder(); ArrayList<String> res = new ArrayList<>(); dfs(s, sb, res, 0, 0); return res; } public void dfs(String s, StringBuilder sb, ArrayList<String> res, int pointSum, int start) { //如果逗号数量为3,则说明分割完成了 if (pointSum == 3) { //再对最后一层循环的字符进行判断是否合法 //左闭塞右开 String sTemp = s.substring(start, s.length()); if (isValid(sTemp)) { sb.append(sTemp); res.add(new String(sb.toString())); sb.delete(sb.length() - sTemp.length(), sb.length()); // sb.setLength(sb.length() - sTemp.length()); return; } } // 检查索引是否超出范围 if (start >= s.length()) { return; } for (int i = start; i < s.length(); i++) { //截取的字符 String sTemp = s.substring(start, i + 1); //判断是否合法 if (!isValid(sTemp)) { //不合法就结束递归 return; } else { // int lengthBeforeAppend = sb.length(); sb.append(sTemp).append("."); pointSum++; dfs(s, sb, res, pointSum, i + 1); //记得删除逗号 // sb.setLength(lengthBeforeAppend); sb.delete(sb.length() - sTemp.length() - 1, sb.length()); pointSum--; } } } // 校验函数 public boolean isValid(String s) { if (s.length() == 0 || (s.charAt(0) == '0' && s.length() != 1)) { return false; } int a = Integer.parseInt(s); return a >= 0 && a <= 255; } }