多个if嵌套比&&好想一点
递归的出口最后回到最外层调用,而回溯的出口在决策树的叶子节点
//决策树根据【加数字】【加点】展开
var restoreIpAddresses = function(s) {
let res=[]
function tra(cur, n, tmp, arch){ //(0~length-1,0~3,'',['',''])
if(cur===s.length&&n===4) res.push(arch)
if(cur<=s.length&&n<4){
if(tmp===''&&s[cur]==='0')tra(cur+1,n+1,'',[...arch,'0'])
else if(tmp.length<3){
if(Number(tmp+s[cur])>255)tra(cur,n+1,'',[...arch,tmp])
else{
if(tmp.length>0) tra(cur,n+1,'',[...arch,tmp])
tra(cur+1,n,tmp+s[cur],[...arch])
}
}else tra(cur,n+1,'',[...arch,tmp])
}
}
tra(0,0,'',[])
res=res.map((l)=>{
let tmp=''
l.forEach((i)=>{tmp+=i+'.'})
return tmp.slice(0,-1)
})
return res
};
//决策树根据【加1/2/3个数字】展开
var restoreIpAddresses = function(s) {
let cur=0,n=1,tmp=[],res=[]//0~length-1,1~4,['','']
function tra(cur,n,tmp){
if(n<=4){
if(cur<s.length){
tra(cur+1,n+1,[...tmp,s[cur]])
if(s[cur]!=='0'){
if(cur<s.length-1)tra(cur+2,n+1,[...tmp,s.slice(cur,cur+2)])
if(cur<s.length-2){
if(Number(s.slice(cur,cur+3))<=255)
tra(cur+3,n+1,[...tmp,s.slice(cur,cur+3)])
}
}
}
}else{
if(cur===s.length)res.push(tmp)
}
}
tra(cur,n,tmp)
return res.map((l)=>{
let str=''
l.forEach((i)=>{str+=i+'.'})
return str.slice(0,-1)
})
};