题目:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。
示例:输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
递归+回溯
题目可以理解为一段字符串分成几断。思路就是先分一段出来,然后再把后面的字符串继续分,这是很常规的递归思想。也就是后续的动作都是重复的。
暂时分出这一段,是需要考虑分出来的长度的。以“25525511135”为例,ip地址每一段长度最长是3,第一段分出来的可以是“2”,可以是“25”,可以是“255”,有三种情况,然后将后面的字符串分为3段。
递归终止条件,就是看最后一次的字符串是不是符合ip地址的要求,即长度是1或者2或者3,数值的大小是小于等于255的。这里说一下为什么是255,ip地址是32位的,总共有4端,每一段是8位,那么最大就是(11111111)即255。符合这个要求的,说明这条路径上分段是合理的,维护一个全局的List存放结果即可。
这递归过程中,有一个剪枝的地方:0的特殊性,0放在每一段开头时长度只能是1,也就是说可以“0.0.10.100”,但不可以“0.00.01.011”。这里需要剪枝。
代码实现
递归+回溯:
回溯过程中就是把之前已经添加进暂存StringBuffer的一段删掉。
1class Solution {
2 public List<String> res;
3 public StringBuffer sb = new StringBuffer();
4
5 public List<String> restoreIpAddresses(String s) {
6 res = new ArrayList<>();
7 if (s.length() <=