leetcode中等93复原IP地址
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等93复原IP地址相关的知识,希望对你有一定的参考价值。
注意:
分成四段;每一段在[0,255]之间;每一段不能用前导0
思路:回溯
以往只需要一个index记录回溯的起始位置
需要两个index,segId
表示第几段,segStart
表示每一段开头的位置
结束条件:
- 1、 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
- 2、如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前结束
回溯情况:
- 3、 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0,dfs 进入下一段的搜索
- 4、一般情况,for 循环枚举每一种可能性并递归
补充:本题由于每一段分别计算,无需回撤操作
class Solution {
List<String>res=new ArrayList<>();
int[] path = new int[4];
//List<String>path=new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
dfs(s,0,0);
return res;
}
//需要两个index,segId表示第几段,segStart表示每一段开头的位置
public void dfs(String s,int segId, int segStart){
//1、 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
if(segId==4){
if(segStart==s.length()){
StringBuilder temp=new StringBuilder();
temp.append(path[0]);
for(int i=1;i<4;i++){
temp.append(".");
temp.append(path[i]);
}
res.add(temp.toString());
}
return;
}
//2、 如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯
if(segStart==s.length()){
return;
}
//3、 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
if(s.charAt(segStart)=='0'){
path[segId]=0;
dfs(s,segId+1,segStart+1);
}
//4、一般情况,枚举每一种可能性并递归
int sum=0;//计算本段是否在0,255之间
for(int i=segStart;i<s.length();i++){
sum = sum * 10 + (s.charAt(i) - '0');
if(sum>0 && sum<=255){
path[segId]=sum;
dfs(s,segId+1,i+1);
}else{
break;
}
}
}
}
以上是关于leetcode中等93复原IP地址的主要内容,如果未能解决你的问题,请参考以下文章