zoukankan      html  css  js  c++  java
  • Trie树-0/1字典树-DFS-1624. 最大距离

    2020-03-18 20:45:47

    问题描述:

    两个二进制串的距离是去掉最长公共前缀的长度之和。比如: 10110001011110的最长公共前缀是1011, 距离就是 len("000"+"110") = 3 + 3 = 6. 现在给一个二进制串的集合, 求两个二进制串的最大距离.

    样例

    样例 1:

    输入:["011000","0111010","01101010"]
    输出:9
    解释: "0111010" 和 "01101010" 的最长前缀是 "011", 距离为 len("1010")+len("01010")=9
    样例 2:
    输入:["011000","0111011","01001010"]
    输出:11
    解释:"0111011" 和 "01001010" 的最长前缀 "01", 距离是 len("11011")+len("001010")=11

    注意事项

    字符串的总长度不超过 200000

    问题求解:

    Trie树的好题,可以先构建一棵Trie树,然后在树上进行做一次DFS就可以得到结果。

    时间复杂度:O(n)

        class TrieNode {
            boolean is_word;
            TrieNode[] next;
            
            public TrieNode() {
                is_word = false;
                next = new TrieNode[2];
            }
        }
         
        int res = 0; 
        public int getAns(String[] S) {
            TrieNode root = new TrieNode();
            for (String s : S) {
                TrieNode curr = root;
                for (int i = 0; i < s.length(); i++) {
                    int idx = s.charAt(i) - '0';
                    if (curr.next[idx] == null) curr.next[idx] = new TrieNode();
                    curr = curr.next[idx];
                }
                curr.is_word = true;
            }
            dfs(root);
            return res;
        }
        
        private int dfs(TrieNode root) {
            if (root == null) return 0;
            int l = dfs(root.next[0]);
            int r = dfs(root.next[1]);
            if (l > 0 &&  r > 0) res = Math.max(res, l + r);
            if (root.is_word && l > 0) res = Math.max(res, l);
            if (root.is_word && r > 0) res = Math.max(res, r);
            return 1 + Math.max(l, r);
        }
    

      

  • 相关阅读:
    待写
    让一个小div在另一个大div里面 垂直居中的四种方法
    20 个有用的 SVG 工具,提供更好的图像处理
    php原理简述
    Apache 打开网页的时候等待时间过长的解决方案
    TCP协议中的三次握手和四次挥手(图解)
    apache 各平台进程线程模块解析
    浅谈移动Web开发(上):深入概念
    响应式布局
    jQuery Mobile 入门教程
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12520081.html
Copyright © 2011-2022 走看看