LeetCode93. 复原IP地址
☆☆☆☆思路:回溯算法.
回溯算法事实上就是在一个树形问题上做DFS。因此,需要先将原问题转化为树形问题
每一个节点可以选择截取的方法有三种:截1位、截2位、截3位。因此每一个结点可以生长出的分支最多只有 3 条分支;
由于 ip 段最多就 4 个段,因此这棵三叉树最多 4 层,这个条件作为递归终止条件之一;
class Solution { public List<String> restoreIpAddresses(String s) { List<String> res = new ArrayList<>(); if (s.length() < 4 || s.length() > 12) return res; dfs(s, 0, new ArrayList<>(), res); return res; } private void dfs(String s, int pos, List<String> list, List<String> res) { if (list.size() == 4) { if (pos == s.length()) { // join 用法:例如 [[255],[255],[111],[35]] -> 255.255.111.35 res.add(String.join(".", list)); } return; } // ip 地址每段最多有三个数字 for (int i = 1; i <= 3; i++) { if (pos + i > s.length()) { break; } String tmp = s.substring(pos, pos + i); // 剪枝条件:段的起始位置不能为 0,段拆箱成 int 类型的长度不能大于 255 int val = Integer.parseInt(tmp); if (tmp.startsWith("0") && tmp.length() > 1 || (i == 3 && val > 255)) { continue; } list.add(tmp); dfs(s, pos + i, list, res); list.remove(list.size() - 1); } } }