2020-03-18 20:45:47
问题描述:
两个二进制串的距离是去掉最长公共前缀的长度之和。比如: 1011000
和1011110
的最长公共前缀是1011
, 距离就是 len("000"+"110") = 3 + 3 = 6
. 现在给一个二进制串的集合, 求两个二进制串的最大距离.
样例
样例 1:
样例 2:输入:["011000","0111010","01101010"] 输出:9 解释: "0111010" 和 "01101010" 的最长前缀是 "011", 距离为 len("1010")+len("01010")=9
输入:["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); }