解题思路
回溯法。设置一个起始下标,从该下标开始遍历模拟每段的IP。首先判断是否有前导0,有就退出循环,没有就取出[start,i]的字符串作为IP的一段,判断该字符串转为数字后是否大于255,超过则退出循环,否则追加到path中,开启下一次搜索,搜索后回溯path。如果path长度为4且段起始下标为字符串长度,说明得到了一个可行解,将path中的四段IP组合成一个完整IP,并返回。
AC代码
func restoreIpAddresses(s string) []string {
res:=[]string{}
path:=make([]string,0,4) //保存每段的IP
var dfs func(int)
dfs=func(start int){
if len(path)==4{
if start==len(s){
str:=strings.Join(path,".")
res=append(res,str)
}
return
}
for i:=start;i<len(s);i++{
//包含了前导0
if i>start&&s[start]=='0'{
break
}
str:=s[start:i+1]
num,_:=strconv.Atoi(str)
if num<=255{
path=append(path,str)
dfs(i+1)
path=path[:len(path)-1] //回溯
}else{
break
}
}
}
dfs(0)
return res
}
感悟
官方题解写得太烂了,根据代码随想录的题解做出小修改后成功AC,比官方题解容易理解多了。