您的位置:首页 > 其它

Leetcode 之 Restore IP Addresses

2015-07-22 00:30 483 查看
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)

这道题是回溯和子串分割的问题,把字串分成当前串、剩余串,并记录当前分了几位(cur,left,num),然后用用递归的方法把满足条件的子串加入结果列表返回即可。

难点在于返回条件的选取,主要有以下几种:

已经分成四段,但是left还有东西的

还没分完但是left已经空的

分割出的子串比255大的

分割成两位,值却比10小的(主要排除01的情况)

分割成三位,值却比100小的(排除001或010的情况)

给的原始串长度小于等于0或者大于12的

当已经分成四段,left还不剩下啥的时候就直接加入结果集吧~

List<String> result = new ArrayList<String>();

public List<String> restoreIpAddresses(String s) {
int len = s.length();
if(len <= 0 || len > 12)    return result;
split("", s, 4);
return result;
}

public void split(String cur, String left, int num){
if(num == 0 && left.length() != 0 ) return;
if(num != 0 && left.equals( ""))    return;

if(num == 0 && left.equals("")){
result.add(cur);
return;
}

String sub = "";
if(left.length() > 0){
sub = left.substring(0, 1);
if(Integer.parseInt(sub) > 255) return;
else{
String addString = cur + "." + sub;
if(num == 4){
addString = cur + sub;
}
split(addString, left.substring(1), num - 1);
}
}

if(left.length() > 1){
sub = left.substring(0, 2);
if(Integer.parseInt(sub) > 255 || Integer.parseInt(sub) < 10)   return;
else{
String addString = cur + "." + sub;
if(num == 4){
addString = cur + sub;
}
split(addString, left.substring(2), num - 1);
}
}

if(left.length() > 2){
sub = left.substring(0, 3);
if(Integer.parseInt(sub) > 255 || Integer.parseInt(sub) < 100)  return;
else{
String addString = cur + "." + sub;
if(num == 4){
addString = cur + sub;
}
split(addString, left.substring(3), num - 1);
}
}
}


147 / 147 test cases passed.

Status: Accepted

Runtime: 312 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode