public List<String> restoreIpAddresses(String s) { int len = s.length(); List<String> res = new ArrayList<>(); if(len<4 ||len>12) { return res; } Deque<String> path = new ArrayDeque<>(4); //这里学习到了 int splitTimes = 0;//已经分割出来多少个IP段 dfs(s,len,splitTimes,0,path,res); return res; } private int judgeIfIpSegment(String s ,int left,int right){ //判断子区间是否能成为一个IP段 int len = right-left+1; if(len>1 &&s.charAt(left) =='0'){ //大于1位的时候,不能以0开头 return -1; } int res = 0; for(int i = left;i<=right;i++){ res = res*10 + s.charAt(i) -'0'; } if(res>255){ return -1; } return res; } private void dfs(String s, int len, int split, int begin, Deque<String> path, List<String> res) { if(begin == len){ if(split == 4){ res.add(String.join(".",path)); } return; } if(len - begin < (4-split)||len - begin > 3*(4-split)){ return; } for(int i = 0;i<3;i++){ if(begin + i >= len){ break; } int ipSegment = judgeIfIpSegment(s,begin,begin+i); if(ipSegment != -1){ //有效IP段 path.addLast(ipSegment+""); dfs(s,len,split+1,begin+i+1,path,res); path.removeLast(); } } }
没能自己独立解决。
——2020.6.29