继续打卡算法题,今天学习的是LeetCode第93题复原 IP 地址,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
本题可以使用回溯算法求解,其实就是把字符串拆分成4个子组合的过程。我们通过画树形图可以将求解过程描述出来。
我们每次都取小于3位数字作为ip的某一段,再取剩下的其他ip段,如果取到了最后,并且有效ip段是4个,那么这样的组合就是有效的ip,加入结果集即可。
本题解题技巧
1、使用回溯算法,剪枝的条件需要控制,有效的ip段是4个。
编码解决
java
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> ans=new ArrayList();
List<String> temp=new ArrayList();
backTracking(s,0,ans,temp);
return ans;
}
public void backTracking(String s,int begin,List<String> ans,List<String> temp){
if(temp.size()==4){
//有效的ip段,加入结果集
if(begin==s.length()){
ans.add(String.join(".",temp));
}
return;
}
//每次取3位以下的字符作为一段ip。这里也是减枝的情况。
for(int i=begin;i<begin+3&&i<s.length();++i){
String sub=s.substring(begin,i+1);
//不是有效的ip段,减枝
if(!isRange(sub)){
continue;
}
temp.add(sub);
backTracking(s,i+1,ans,temp);
//回溯
temp.remove(temp.size()-1);
}
}
public boolean isRange(String sub){
if(sub.length()!=1&&sub.charAt(0)=='0'){
return false;
}
return Integer.parseInt(sub)<=255?true:false;
}
}
总结
1、了解过回溯思路对于解决本题会有感觉的,组合和排列问题我们要记住通过画树形图
来分析解题思路。