114、复原IP地址

题目描述:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

示例:

输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]

递归+回溯

代码:

public List<String> restoreIpAddresses(String s) {
	 
		List<String> list = new ArrayList<>();
		if (s == null || s.length() == 0) {
			return list;
		}
		//sb是一个临时结果,当其满足条件时,才会被加入到最终的list中.
		StringBuilder sb = new StringBuilder();
		getRes(0, sb, list, s);
		return list;
	}
//	k表示的是生成几段
	public void getRes(int k, StringBuilder sb, List<String> list, String s) {
		if (k == 4 || s.length()==0) {
//如果k==4并且s.length==0说明给定的字符串被我们分成了合理的四段,
//并且没有剩余的字符,此时sb就是一个结果,加入到list中.
			if (k==4 && s.length()==0) {
				list.add(sb.toString());
			}
			return;
		}
		for (int i = 0; i < s.length() && i <= 2; i++) {
			//下面这个if循环是为了避免出现类似于0.1.001.0这种结果.
			if (i != 0 && s.charAt(0)=='0') {
				break;
			}
			//从s中截取后一段数字.
			String tmp = s.substring(0, i+1);
			//首先判断刚才截取的这段数字是否<=255,若满足,则进入if判断中.
			if (Integer.valueOf(tmp) <= 255) {
//如果此时临时结果sb的长度不为0,说明我们往sb后面拼凑的数字应该是.+数字这种形式,
//				而不是直接拼接数字.
				if (sb.length() != 0) {
					tmp = "." + tmp;
				}
				sb.append(tmp);
				//k+1, 再把s从第i+1位截取到最后,得到新的s,进行递归.
				getRes(k+1, sb, list, s.substring(i+1));
//把上面append进来的tmp删掉,从sb长度的第sb.length()-tmp.length()位开始,
//				一直删除到最后.
				sb.delete(sb.length()-tmp.length(), sb.length());
			}
	    }
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值