Problem: 牛客 接头密匙
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
这个问题可以通过使用前缀树(Trie)来解决。前缀树是一种用于存储字符串的数据结构,其中每个节点代表一个字符串的前缀。在这个问题中,我们可以使用前缀树来存储数组b中的所有字符串,并在数组a中查找是否存在相同的字符串。
解题方法
首先,我们需要清空前缀树,并将所有的字符串插入到前缀树中。然后,我们遍历数组a,对于每一个字符串,我们都在前缀树中查找是否存在相同的字符串。如果存在,我们就将结果数组的对应位置加一。
复杂度
时间复杂度:
O ( n ) O(n) O(n),其中n是数组a和b的总长度。因为我们需要遍历所有的字符串,并在前缀树中插入和查找。
空间复杂度:
O ( n ) O(n) O(n),其中n是数组a和b的总长度。因为我们需要使用一个前缀树来存储所有的字符串。
Code
import java.util.*;public class Solution {/*** 思路: 建立b的前缀树 a中形成的字符 ——》在a中sreach*** @param b int整型二维数组* @param a int整型二维数组* @return int整型一维数组*/static int MAXN = (int)(1e6 + 10);static int[][] tree = new int[MAXN][12];static int[] pass = new int[MAXN];static int cnt = 1;public static int[] countConsistentKeys (int[][] b, int[][] a) {clear();// write code hereint[] ans = new int[b.length];StringBuffer sb = new StringBuffer();for (int i = 0; i < a.length; i++) {sb.setLength(0);for (int j = 1; j < a[i].length; j++) {sb.append(String.valueOf(a[i][j] - a[i][j - 1])).append("#");}insert(sb.toString());}for (int i = 0; i < b.length; i++) {sb.setLength(0);for (int j = 1; j < b[i].length; j++) {sb.append(String.valueOf(b[i][j] - b[i][j - 1])).append("#");}ans[i] = count(sb.toString());}return ans;}static void insert(String word) {int cur = 1;pass[cur]++;for (int i = 0, path; i < word.length(); i++) {path = deal(word.charAt(i));if (tree[cur][path] == 0) {tree[cur][path] = ++cnt;}cur = tree[cur][path];pass[cur]++;}}static int count(String pre) {int cur = 1;for (int i = 0, path; i < pre.length(); i++) {path = deal(pre.charAt(i));if (tree[cur][path] == 0) {return 0;}cur = tree[cur][path];}return pass[cur];}static int deal(char ch) {if (ch == '#') {return 10;} else if (ch == '-') {return 11;}return ch - '0';}static void clear() {for (int i = 0; i <= cnt; i++) {Arrays.fill(tree[i], 0);pass[i] = 0;}}
}