Question
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given "25525511135"
,
return ["255.255.11.135", "255.255.111.35"]
. (Order does not matter)
本题难度Medium。
DFS
【复杂度】
时间 O(N) 空间 O(N)
【思路】
利用DFS进行搜索,到达底部加入到结果中。这里需要用到剪枝(第19行)。
【注意】
有效的ip不允许前缀为0,比如:010
,但允许单个0。
【代码】
public class Solution {
public List<String> restoreIpAddresses(String s) {
//require
List<String> ans=new LinkedList<>();
List<String> ip=new LinkedList<>();
//invariant
dfs(ip,s,0,ans);
//ensure
return ans;
}
private void dfs(List<String> ip,String s,int start,List<String> ans){
//base case
if(ip.size()==4&&start==s.length()){
ans.add(ip.get(0)+"."+ip.get(1)+"."+ip.get(2)+"."+ip.get(3));
return;
}
int remain=4-ip.size();
if(remain>(s.length()-start)||remain*3<(s.length()-start))return; //剪枝
int num=0;
for(int i=start;i<start+3;i++){
if(i+1<=s.length()){
num=num*10+s.charAt(i)-'0';
if(num>=0&&num<=255){
ip.add(s.substring(start,i+1));
dfs(ip,s,i+1,ans);
ip.remove(ip.size()-1);
}
if(num==0)break;//不允许前缀为0,但允许单个0
}
}
}
}