题目:
题解:
- dfs 暴力搜索,求取字符串 s 的所有子串集合
- 从集合中匹配符合条件的结果
class Solution {
private List<List<String>> splitList = new ArrayList<>();
private LinkedList<String> list = new LinkedList<>();
public List<String> restoreIpAddresses(String s) {
dfsForSplit(s, 0);
List<String> resultList = new ArrayList<>();
for (List<String> stringList : splitList) {
if (stringList.size() != 4) {
continue;
}
boolean matched = true;
for (int i = 0; i < stringList.size() && matched; i++) {
matched = isMatched(stringList.get(i));
}
if (matched) {
resultList.add(String.join(".", stringList));
}
}
return resultList;
}
private boolean isMatched(String s) {
if (s.length() != 1 && s.startsWith("0")) {
return false;
}
if (s.length() > 3) {
return false;
}
if (Integer.parseInt(s) > 255) {
return false;
}
return true;
}
private void dfsForSplit(String s, int start) {
if (s == null || s.length() == 0) {
splitList.add(new ArrayList<>(list));
return;
}
for (int i = start; i < s.length(); i++) {
String prefix = s.substring(start, i+1);
list.add(prefix);
dfsForSplit(s.substring(i+1), start);
list.removeLast();
}
}
}
剪枝:
- 在分割字符串过程中,如果当前字符已经不满足IP条件,停止搜索
- 因为IP串由四段整数组成,如果集合元素个数超过4,那么一定不是合法IP,停止搜索
public class RestoreIpAddresses {
private List<List<String>> splitList = new ArrayList<>();
private LinkedList<String> list = new LinkedList<>();
public List<String> restoreIpAddresses(String s) {
dfsForSplit(s, 0);
List<String> resultList = new ArrayList<>();
for (List<String> stringList : splitList) {
if (stringList.size() != 4) {
continue;
}
boolean matched = true;
for (int i = 0; i < stringList.size() && matched; i++) {
matched = isMatched(stringList.get(i));
}
if (matched) {
resultList.add(String.join(".", stringList));
}
}
return resultList;
}
private boolean isMatched(String s) {
if (s.length() != 1 && s.startsWith("0")) {
return false;
}
if (s.length() > 3) {
return false;
}
if (Integer.parseInt(s) > 255) {
return false;
}
return true;
}
private void dfsForSplit(String s, int start) {
if (s == null || s.length() == 0) {
splitList.add(new ArrayList<>(list));
return;
}
// 剪枝
if (list.size() > 4) {
return;
}
for (int i = start; i < s.length(); i++) {
String prefix = s.substring(start, i+1);
// 剪枝
if (!isMatched(prefix)) {
continue;
}
list.add(prefix);
dfsForSplit(s.substring(i+1), start);
list.removeLast();
}
}
}