zoukankan      html  css  js  c++  java
  • 0093复原IP地址 Marathon

    有效 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 ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你不能重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

    示例 1:

    输入:s = "25525511135"
    输出:["255.255.11.135","255.255.111.35"]
    示例 2:

    输入:s = "0000"
    输出:["0.0.0.0"]
    示例 3:

    输入:s = "1111"
    输出:["1.1.1.1"]
    示例 4:

    输入:s = "010010"
    输出:["0.10.0.10","0.100.1.0"]
    示例 5:

    输入:s = "101023"
    输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

    提示:

    0 <= s.length <= 20
    s 仅由数字组成

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/restore-ip-addresses

    参考:

    python

    # 复原IP地址
    
    class Solution:
        def __init__(self):
            self.s = ""
            self.res = []
    
        def isVaild(self, s: str) -> bool:
            if len(s) > 1 and s[0] == "0":
                return False
    
            if 0 <= int(s) <= 255:
                return True
    
            return False
    
        def backTrack(self, path:[str], start:int):
            if start == len(self.s) and len(path) == 4:
                self.res.append(".".join(path))
                return
    
            for end in range(start+1, len(self.s)+1):
                # 剪枝
                # 保证切割完没有剩余的字符
                if len(self.s)-end > 3*(4-len(path)-1):
                    continue
                if self.isVaild(self.s[start:end]):
                    # 参数处更新状态,path变量没有改变,不用pop
                    self.backTrack(path+[self.s[start:end]], end)
    
        def restoreIpAddresses(self, s: str) -> [str]:
            if len(s) > 3*4:
                return []
            self.s = s
            self.backTrack([], 0)
            return self.res
    
    class Solution2:
        def restoreIpAddresses(self, s: str) -> [str]:
            ans = []
            path = []
            def backTrack(path: [str], startIndex: int):
                if len(s)>12:return []
                if len(path) == 4:
                    if startIndex == len(s):
                        ans.append(".".join(path[:]))
                        return
                for i in range(startIndex, min(startIndex+4, len(s)+1)): #剪枝
                    str_ = s[startIndex:i]
                    if not 0 <= int(str_) <= 255:
                        continue
                    if not str_ == "0" and not str_.lstrip("0") == str_:
                        continue
                    path.append(str_)
                    backTrack(path, i)
                    path.pop()
            backTrack([], 0)
            return ans
    

    golang

    package backTrack
    
    import "strconv"
    
    func restoreIpAddresses(s string) []string {
    	var res, path []string
    	backtrackIP(s, path, 0, &res)
    	return res
    }
    
    func backtrackIP(s string, path []string, startIndex int, res *[]string)  {
    	// 终止条件
    	if startIndex == len(s) && len(path) == 4 {
    		tmpIPString := path[0] + "." + path[1] + "." + path[2] + "." + path[3]
    		*res = append(*res, tmpIPString)
    	}
    	for i:=startIndex;i<len(s);i++ {
    		// 处理8bit的ip分段
    		path := append(path, s[startIndex:i+1])
    		if i-startIndex+1 <= 3 && len(path) <= 4 && isVaildIp(s, startIndex,i) {
    			// 递归
    			backtrackIP(s, path, i+1,res)
    		} else {return}
    		// 回溯
    		path = path[:len(path)-1]
    	}
    
    }
    
    func isValidIp(s string, startIndex,end int) bool {
    	checkInt,_ := strconv.Atoi(s[startIndex:end+1])
    	if end - startIndex + 1 > 1 && s[startIndex] == '0' {
    		return false
    	}
    	if checkInt > 255 {
    		return false
    	}
    	return true
    }
    
    
  • 相关阅读:
    Unix进程和线程管理及其异同
    UnixIPC之共享内存
    Unix/Linux常用文件操作
    java中int和Integer比较
    JAVA四种引用类型
    JAVA-Exception&Error
    JAVA特性-跨平台/面向对象
    JAVA单向链表实现
    linux安装及配置c++的opencv库
    static_cast、const_cast、dynamic_cast、reinterpret_cast
  • 原文地址:https://www.cnblogs.com/davis12/p/15586332.html
Copyright © 2011-2022 走看看