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);
    }

  

posted @ 2020-03-18 20:46  hyserendipity  阅读(239)  评论(0编辑  收藏  举报