复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
思路+代码+注释:
public List<String> restoreIpAddresses(String s) {
/*
思路:求所有情况,采用递归解决
IP地址分为四段,可以递归一段一段的确定,每一段可以是一位数、二位数、三位数,数值的范围在0~255
注意在进行每段确认的时候,确认的字符串是上一段确认后剩余的串
当duan==5时,递归结束。如果此时字符串s为“”那么证明该IP符合要求添加到res结果中
*/
List<String> out=new ArrayList<>();
List<List<String>> res=new ArrayList<List<String>>();
List<String> resStr=new ArrayList<>();
queRenDuan(s,1,out,res);
for (List<String> strs:res
) {
StringBuilder str=new StringBuilder();
for (int i = 0; i < strs.size(); i++) {
if (i==strs.size()-1)
{
str.append(strs.get(i));
}else {
str.append(strs.get(i)+".");
}
}
resStr.add(str.toString());
}
return resStr;
}
private void queRenDuan(String s,int duan,List<String> out,List<List<String>> res)
{
if (duan == 5)
{
if (s.equals(""))
{
res.add(new ArrayList<String>(out));
}
return;
}
for (int i = 0; i < 3; i++) {
//判断剩余字符串中是否有足够的字符
if (s.length() > i)
{
//如果是两位数第一位不能为0
if (i==1 && s.substring(0,1).equals("0"))
{
return;
}
//如果是三位数前两位不能都为0
if (i==2 && s.substring(0,2).equals("00"))
{
return;
}
String num=s.substring(0,i+1);
if (Integer.parseInt(num) < 256)
{
out.add(num);
queRenDuan(s.substring(i+1),duan+1,out,res);
out.remove(out.size()-1);
}
//该段的值大于255,说明不符合要求直接返回
else {
return;
}
}
//没有足够的字符不符合情况直接返回
else {
return;
}
}
}