[leetcode]Restore IP Addresses

新博文地址:[leetcode]Restore IP Addresses

 

Restore IP Addresses

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)

 还是很经典的DFS,只不过要做出一些剪枝操作,

比如第一字段已经确定,后缀长应该在[3,9],如果不再这个范围可以直接跳过

字段以0开头是不合法的,直接跳过(单个0是合法的)

字段大小超过255是不合法的,直接跳过。

跳过要记得回溯

	List<String> result = new ArrayList<String>();
	public List<String> restoreIpAddresses(String s) {
		dfs("", s, 1);
		return result;		
    }
	
	private void dfs(String pre,String s, int frag){//frag表示字段数
		if(frag == 4 && s.length() < 4 && Integer.valueOf(s) <= 255 ){
			if(s.length() > 1 && s.charAt(0) == '0'){//字段长>1,但是以0开头
				return;
			}
			String oneCase = pre + "." + s;
			result.add(oneCase);
			return;
		}
		if(frag != 1){
			pre += ".";
		}
		for(int i = 0 ; i < 3 && i < s.length(); i++){
			String suffix = s.substring(i + 1);
			String thisFrag = s.substring(0, i + 1);
			if(suffix.length() <= 3 * (4 - frag) && suffix.length() >= (4-frag) && Integer.valueOf(thisFrag) < 256 ){//由于太长了,我将以0开头的剪枝条件放在里面了。。。
				if(thisFrag.length() > 1 && thisFrag.charAt(0)=='0'){
					break;
				}
				pre += thisFrag;
				dfs(pre, suffix, frag + 1);
				pre = pre.substring(0, pre.length() - thisFrag.length());//回溯
			}
		}
	}

 

你可能感兴趣的:(LeetCode)