題目
給定一個只包含數字的字符串,復原它並返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四個整數(每個整數位於 0 到 255 之間組成),整數之間用 '.' 分隔。
示例:
輸入: "25525511135"
輸出: ["255.255.11.135", "255.255.111.35"]
解決方法
//回溯用
LinkedList<String> linkedList = new LinkedList<>();
//保存結果用
List<String> result = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
dfs(s,0,0);
return result;
}
public void dfs(String string,int dort,int curIndex){
//判斷點的個數 如果是3個點 都滿足 那麼就是真的ip地址
// 回溯 結束的條件 就是具備三個點
//對於每一個點 各種情況 如果說其中有一個後續直接不滿足 回溯
//如果當前的index 超過了字符串的長度 返回
if (curIndex >= string.length()) {
return;
}
//如果當前的字符串是0 那麼後面就不能增加字符串了,因爲不能出現01.01.01.01 這種
int max = string.charAt(curIndex) == '0' ? 1 : 3;
for (int i = 1; i <= max; i++) {
//保證不要超過整個字符串大小
if (curIndex + i > string.length()) {
continue;
}
//截取字符串
String substring = string.substring(curIndex, curIndex + i);
//如果是合理的字符串 (0<x <255)
if (!isInvalidate(substring)) {
continue;
}
//增加
linkedList.add(substring);
//如果是第三個點 那麼就是結束的時候了
if (dort == 3) {
//如果當前的長度是整個數組的長度 那麼就是結束的時候了
if (curIndex + substring.length() == string.length()) {
//添加結果
String join = String.join(".", linkedList);
result.add(join);
}
}else {
//如果不是最後一個點 那麼添加下一個點
dfs(string,dort + 1,curIndex + substring.length());
}
//回溯
linkedList.pollLast();
}
}
public boolean isInvalidate(String string){
return string.length() <= 3 && Integer.parseInt(string) <= 255;
}