LeetCode-in-Java

3043. Find the Length of the Longest Common Prefix

Medium

You are given two arrays with positive integers arr1 and arr2.

A prefix of a positive integer is an integer formed by one or more of its digits, starting from its leftmost digit. For example, 123 is a prefix of the integer 12345, while 234 is not.

A common prefix of two integers a and b is an integer c, such that c is a prefix of both a and b. For example, 5655359 and 56554 have a common prefix 565 while 1223 and 43456 do not have a common prefix.

You need to find the length of the longest common prefix between all pairs of integers (x, y) such that x belongs to arr1 and y belongs to arr2.

Return the length of the longest common prefix among all pairs. If no common prefix exists among them, return 0.

Example 1:

Input: arr1 = [1,10,100], arr2 = [1000]

Output: 3

Explanation: There are 3 pairs (arr1[i], arr2[j]):

The longest common prefix is 100 with a length of 3.

Example 2:

Input: arr1 = [1,2,3], arr2 = [4,4,4]

Output: 0

Explanation: There exists no common prefix for any pair (arr1[i], arr2[j]), hence we return 0.

Note that common prefixes between elements of the same array do not count.

Constraints:

Solution

public class Solution {
    public int longestCommonPrefix(int[] arr1, int[] arr2) {
        Trie trie = new Trie();
        for (int num : arr2) {
            trie.addWord(String.valueOf(num));
        }
        int longest = 0;
        String val;
        for (int num : arr1) {
            val = String.valueOf(num);
            if (val.length() > longest) {
                longest = Math.max(longest, trie.findLongestPrefix(val));
            }
        }
        return longest;
    }

    private static class Trie {
        TrieNode root;

        public Trie() {
            root = new TrieNode();
        }

        public void addWord(String word) {
            TrieNode first = root;
            int codePoint;
            for (int i = 0; i < word.length(); i++) {
                codePoint = word.charAt(i) - '0';
                if (first.nodes[codePoint] == null) {
                    first.nodes[codePoint] = new TrieNode();
                }
                first = first.nodes[codePoint];
            }
        }

        public int findLongestPrefix(String word) {
            TrieNode first = root;
            int i = 0;
            int codePoint;
            while (i < word.length()) {
                codePoint = word.charAt(i) - '0';
                if (first.nodes[codePoint] == null) {
                    return i;
                }
                first = first.nodes[codePoint];
                i++;
            }
            return i;
        }
    }

    private static class TrieNode {
        TrieNode[] nodes;

        public TrieNode() {
            nodes = new TrieNode[10];
        }
    }
}