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;
}