zoukankan      html  css  js  c++  java
  • [LeetCode] Restore IP Addresses 复原IP地址

                      [LeetCode] Restore IP Addresses 复原IP地址

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

    示例:

    输入: "25525511135"
    输出: ["255.255.11.135", "255.255.111.35"]

    IP地址由32位二进制数组成,为便于使用,常以XXX.XXX.XXX.XXX形式表现,每组XXX代表小于或等于255的10进制数。所以说IP地址总共有四段,每一段可能有一位,两位或者三位,范围是[0, 255],题目明确指出输入字符串只含有数字,所以当某段是三位时,我们要判断其是否越界(>255),还有一点很重要的是,当只有一位时,0可以成某一段,如果有两位或三位时,像 00, 01, 001, 011, 000等都是不合法的,所以我们还是需要有一个判定函数来判断某个字符串是否合法。这道题其实也可以看做是字符串的分段问题,在输入字符串中加入三个点,将字符串分为四段,每一段必须合法,求所有可能的情况。我们用k来表示当前还需要分的段数,如果k = 0,则表示三个点已经加入完成,四段已经形成,若这时字符串刚好为空,则将当前分好的结果保存。若k != 0, 则对于每一段,我们分别用一位,两位,三位来尝试,分别判断其合不合法,如果合法,则调用DFS递归继续分剩下的字符串,最终和求出所有合法组合,代码如下:

    1. class Solution(object):
    2. def restoreIpAddresses(self, s):
    3. """
    4. :type s: str
    5. :rtype: List[str]
    6. """
    7. if s == "" or len(s) > 12 or len(s) < 4:
    8. return []
    9. result = []
    10. parts = 4
    11. item = ""
    12. self.DFS(s, parts, item, result)
    13. return result
    14. def DFS(self, s, parts, item, result):
    15. if parts == 0:#全部取完
    16. if s == "":
    17. result.append(item)
    18. else:
    19. for i in range(1, 4):
    20. if len(s) >= i and self.isValid(s[:i]):
    21. if parts == 1:#最后一部分
    22. self.DFS(s[i:], parts-1, item+s[:i], result)
    23. else:#开始部分
    24. self.DFS(s[i:], parts-1, item+s[:i]+".", result)
    25. def isValid(self, s):
    26. if s == "" or len(s) > 3 or (len(s) > 1 and s[0] == "0"):
    27. return False
    28. Int_s = int(s)
    29. return Int_s <= 255 and Int_s >= 0
    				<script>
    					(function(){
    						function setArticleH(btnReadmore,posi){
    							var winH = $(window).height();
    							var articleBox = $("div.article_content");
    							var artH = articleBox.height();
    							if(artH > winH*posi){
    								articleBox.css({
    									'height':winH*posi+'px',
    									'overflow':'hidden'
    								})
    								btnReadmore.click(function(){
    									articleBox.removeAttr("style");
    									$(this).parent().remove();
    								})
    							}else{
    								btnReadmore.parent().remove();
    							}
    						}
    						var btnReadmore = $("#btn-readmore");
    						if(btnReadmore.length>0){
    							if(currentUserName){
    								setArticleH(btnReadmore,3);
    							}else{
    								setArticleH(btnReadmore,1.2);
    							}
    						}
    					})()
    				</script>
    				</article>
  • 相关阅读:
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Path Sum
    Symmetric Tree
    Solve Tree Problems Recursively
    632. Smallest Range(priority_queue)
    609. Find Duplicate File in System
    poj3159最短路spfa+邻接表
  • 原文地址:https://www.cnblogs.com/AcceptedLin/p/9778900.html
Copyright © 2011-2022 走看看