题目传送:https://leetcode.cn/problems/restore-ip-addresses/submissions/
运行效率:
代码如下:
public static List<String> restoreIpAddresses(String s) {
//
List<String> result = new ArrayList<>();
Deque<String> deque = new ArrayDeque<>();
//处理特殊情况
if(s.length()<4||s.length()>12){
return result;
}
dfs(s,0,deque,result);
return result;
}
/**
* 校验该字符串 是否能够成为一个 合格ip 段
*
* @param str
* @return
*/
public static boolean checkSegment(String str) {
//比如012 肯定就是不行的
if (str.startsWith("0") && str.length() > 1) {
return false;
}
int i = Integer.parseInt(str);
//ip分段的数字不能大于255
return i <= 255;
}
public static void dfs(String s, int begin, Deque<String> deque, List<String> res) {
//处理边界情况
if (begin == s.length()) {
if (deque.size() == 4) {
res.add(String.join(".", deque));
}
return;
}
//因为合法ip的每一段长度最多是3位
if ((s.length() - begin) > (4 - deque.size()) * 3) {
return;
}
//对当前ip段进行长度的枚举
for (int i = 1; i <= 3; i++) {
if(begin+i<=s.length()){
String segment = s.substring(begin, begin + i);
//校验该片段是否是一个合理的ip部分
boolean b = checkSegment(segment);
if(b){
//典型的回溯法 先add 用完后再remove
deque.add(segment);
dfs(s,begin+i,deque,res);
deque.removeLast();
}
}
}
}