1.题目描述
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
2.解法
2.1 回溯剪枝法
private int n;
private String s;
private LinkedList<String> segments = new LinkedList<String>();
private List<String> res = new ArrayList<String>();
public List<String> restoreIpAddresses(String s) {
this.s =s;
n = s.length();
back_track(0, 1);
return res;
}
/**
* 回溯剪枝法
* @param prev_pos:上一个已放置的位置
* @param dot:已放置的点的数量
*/
private void back_track(int prev_pos, int dot) {
int next_pos = Math.min(n-1, prev_pos+3);
for(int cur_pos=prev_pos+1;cur_pos<=next_pos;cur_pos++) {
String str = s.substring(prev_pos, cur_pos);
if(validPot(str)) {
segments.add(str);
if(dot ==3) {
handleRes(cur_pos);
}else {
back_track(cur_pos, dot+1);
}
segments.removeLast();
}
}
}
private void handleRes(int cur_pos) {
String remainStr = s.substring(cur_pos);
if(validPot(remainStr)) {
segments.add(remainStr);
res.add(String.join(".", segments));
segments.removeLast();
}
}
private boolean validPot(String str) {
if(str == null || str.length()<1 || str.length()>3) {
return false;
}
return str.charAt(0)=='0'?str.length()==1 : Integer.parseInt(str)<256;
}