Skip to content

Latest commit

 

History

History
126 lines (106 loc) · 3.92 KB

93.复原IP地址.md

File metadata and controls

126 lines (106 loc) · 3.92 KB

93. 复原 IP 地址

url

题目

给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
输入:s = "0000"
输出:["0.0.0.0"]

方法

code

js

var restoreIpAddresses = function(s) {
    const res = [];
    // 复原从start开始的子串
    const dfs = (subRes, start) => {
        if (subRes.length === 4 && start === s.length) { // 片段满4段,且耗尽所有字符
            res.push(subRes.join('.'));                  // 拼成字符串,加入解集
            return;                     // 返不返回都行,指针已经到头了,严谨的说还是返回
        }
        if (subRes.length === 4 && start < s.length) {  // 满4段,字符未耗尽,不用往下选了
            return;
        }
        for (let len = 1; len <= 3; len++) {           // 枚举出选择,三种切割长度
            if (start + len - 1 >= s.length) return;     // 加上要切的长度就越界,不能切这个长度
            if (len !== 1 && s[start] === '0') return;     // 不能切出'0x'、'0xx'

            const str = s.substring(start, start + len); // 当前选择切出的片段
            if (len === 3 && str > 255) return;          // 不能超过255

            subRes.push(str);                            // 作出选择,将片段加入subRes
            dfs(subRes, start + len);                    // 基于当前选择,继续选择,注意更新指针
            subRes.pop(); // 上面一句的递归分支结束,撤销最后的选择,进入下一轮迭代,考察下一个切割长度
        }
    };

    dfs([], 0);       // dfs入口
    return res;
};

go

func restoreIpAddresses(s string) []string {
	res := make([]string, 0)
	var dfs func(subRes []string, start int)
	dfs = func(subRes []string, start int) {
		if len(subRes) == 4 && start == len(s) {
			res = append(res, strings.Join(subRes, "."))
			return
		}
		if len(subRes) == 4 && start < len(s) {
			return
		}
		for l := 1; l <= 3; l++ {
			if start+l-1 >= len(s) {
				return
			}
			if l != 1 && s[start] == '0' {
				return
			}
			str := s[start:start+l]
			strInt, _ := strconv.Atoi(str)
			if l == 3 && strInt> 255 {
				return
			}
			subRes = append(subRes, str)
			dfs(subRes, start + l)
			subRes = subRes[:len(subRes)-1]
		}
	}
	dfs([]string{}, 0)
	return res
}

java

class Solution {
    public List<String> restoreIpAddresses(String s) {
        List<String> addresses = new ArrayList<>();
        StringBuilder tempAddress = new StringBuilder();
        doRestore(0, tempAddress, addresses, s);
        return addresses;
    }
    private void doRestore(int k, StringBuilder tempAddress, List<String> addresses, String s) {
        if (k == 4 || s.length() == 0) {
            if (k == 4 && s.length() == 0) {
                addresses.add(tempAddress.toString());
            }
            return;
        }
        for (int i = 0; i < s.length() && i <= 2; i++) {
            if (i != 0 && s.charAt(0) == '0') break;
            String part = s.substring(0, i + 1);
            if (Integer.valueOf(part) <= 255) {
                if (tempAddress.length() != 0) {
                    part = "." + part;
                }
                tempAddress.append(part);
                doRestore(k + 1, tempAddress, addresses, s.substring(i + 1));
                tempAddress.delete(tempAddress.length() - part.length(),tempAddress.length());
            }
        }
    }
}