zoukankan      html  css  js  c++  java
  • leetcode:IP地址问题

    93.复原IP地址

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

    示例:

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

    def restoreIpAddresses(s):
        def valid(segment):
            return int(segment) <= 255 if segment[0] != '0' else len(segment) == 1
    
        def update_output(curr_pos):
            segment = s[curr_pos + 1: n]
            if valid(segment):
                segments.append(segment)
                output.append(segments)
                segments.pop()
    
        def backtrack(prev_pos = -1, dots = 3):
            for curr_pos in range(prev_pos+1, min(n-1, prev_pos+4)):
                segment = s[prev_pos + 1:curr_pos + 1]
                if valid(segment):
                    segments.append(segment)
                    if dots - 1 == 0:
                        update_output(curr_pos)
                    else:
                        backtrack(curr_pos, dots - 1)
                    segments.pop()
        n = len(s)
        output, segments = [], []
        backtrack()
        return output
    class Solution {
        int n;
        String s;
        LinkedList<String> segments = new LinkedList<String>();
        ArrayList<String> output = new ArrayList<String>();
    
        public boolean valid(String segment){
            int m = segment.length();
            if (m > 3) return false;
            return (segment.charAt(0) != '0') ? (Integer.valueOf(segment) <= 255) : (m == 1);
        }
    
        public void update_output(int curr_pos) {
            String segment = s.substring(curr_pos + 1, n);
            if (valid(segment)){
                segments.add(segment);
                output.add(String.join(".", segments));
                segments.removeLast();
            }
        }
    
        public void backtrack(int prev_pos, int dots){
            int max_pos = Math.min(n-1, prev_pos+4);
            for (int curr_pos = prev_pos + 1; curr_pos < max_pos; curr_pos++){
                String segment = s.substring(prev_pos + 1, curr_pos + 1);
                if (valid(segment)){
                    segments.add(segment);
                    if (dots - 1 == 0) update_output(curr_pos);
                    else backtrack(curr_pos, dots - 1);
                    segments.removeLast();
                }
            }
    
        }
    
        public List<String> restoreIpAddresses(String s) {
            int prev_pos = -1;
            int dots = 3;
            n = s.length();
            this.s = s;
            backtrack(prev_pos, dots);
            return output;
    
        }
    }

    468.验证IP地址

    思路一:正则

    思路二:分治

    import re
    chunk_IPv4 = r'([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
    pattern_IPv4 = re.compile(r'^(' + chunk_IPv4 + r'.){3}' + chunk_IPv4 + r'$')
    
    chunk_IPv6 = r'([0-9a-fA-F]{1,4})'
    pattern_IPv6 = re.compile(r'^(' + chunk_IPv6 + r':){7}' + chunk_IPv6 + r'$')
    
    def validIPAddress(IP: str) -> str:
        if '.' in IP:
            return "IPv4" if pattern_IPv4.match(IP) else "Neither"
        if ':' in IP:
            return "IPv6" if pattern_IPv6.match(IP) else "Neither"
        return "Neither"
    import java.util.regex.Pattern;
    class Solution {
        String chunkIPv4 = "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])";
        Pattern patternIPv4 = Pattern.compile("^(" + chunkIPv4 + "\.){3}" + chunkIPv4 + "$");
    
        String chunkIPv6 = "([0-9a-fA-F]{1,4})";
        Pattern patternIPv6 = Pattern.compile("^(" + chunkIPv6 + "\:){7}" + chunkIPv6 + "$");
        public String validIPAddress(String IP) {
            if (IP.contains(".")){
                return (patternIPv4.matcher(IP).matches()) ? "IPv4" : "Neither";
            }
            else if (IP.contains(":")){
                return (patternIPv6.matcher(IP).matches()) ? "IPv6" : "Neither";
            }
            return "Neither";
        }
    }

    1108.IP地址无效化

    给你一个有效的 IPv4地址 address,返回这个 IP 地址的无效化版本。

    所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 "."

    def defangIPaddr(address: str) -> str:
            res = ''
            for i in address:
                if i == '.':
                    res += '[.]'
                else:
                    res += i
            return res

    //
    def defangIPaddr(address: str) -> str:
            return address.replace('.','[.]')
    class Solution {
        public String defangIPaddr(String address) {
            StringBuilder sb = new StringBuilder();
            String[] splits = address.split("\.");
            for (String split: splits){
                sb.append(split + "[.]");
            }
            return sb.toString().substring(0, sb.length() - 3);
        }
    }
  • 相关阅读:
    老鸟的Python新手教程
    vs2010经常使用快捷键
    SQL基础--&gt; 约束(CONSTRAINT)
    哈哈,做题了
    【网络协议】TCP中的四大定时器
    JAVA反射机制
    JUnit入门
    怎样将程序猿写出来的程序打包成安装包(最简单的)
    事件传递机制总结
    理解class.forName()
  • 原文地址:https://www.cnblogs.com/liushoudong/p/12832551.html
Copyright © 2011-2022 走看看