Trie-Trie-Trie!!! - Part 4

A super simple implementation of a Trie: a class with just a hash table as the children. The code for the prefix len becomes super easy (two lines). A little slow probably because of the conversion to strings, can be sped up by using just numerical manipulation. Code is down below, cheers, ACC.

Find the Length of the Longest Common Prefix - LeetCode

3043. Find the Length of the Longest Common Prefix
Medium

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

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.

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 themreturn 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 of (1, 1000) is 1.
- The longest common prefix of (10, 1000) is 10.
- The longest common prefix of (100, 1000) is 100.
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:

  • 1 <= arr1.length, arr2.length <= 5 * 104
  • 1 <= arr1[i], arr2[i] <= 108
Accepted
14,023
Submissions
48,390

public class NumberTrie
{
    private Hashtable children = null;

    public NumberTrie()
    {
        children = new Hashtable();
    }

    public void Add(string str)
    {
        if (String.IsNullOrEmpty(str)) return;
        if (!children.ContainsKey(str[0])) children.Add(str[0], new NumberTrie());
        NumberTrie child = (NumberTrie)children[str[0]];
        child.Add(str.Substring(1));
    }

    public int PrefixLen(string str)
    {
        if (String.IsNullOrEmpty(str) || !children.ContainsKey(str[0])) return 0;
        return 1 + ((NumberTrie)children[str[0]]).PrefixLen(str.Substring(1));
    }
}

public int LongestCommonPrefix(int[] arr1, int[] arr2)
{
    NumberTrie numberTrie = new NumberTrie();

    foreach (int n in arr1)
        numberTrie.Add(n.ToString());

    int retVal = 0;
    foreach (int n in arr2)
        retVal = Math.Max(retVal, numberTrie.PrefixLen(n.ToString()));

    return retVal;
}

Comments

Popular posts from this blog

Changing the root of a binary tree

ProjectEuler Problem 719 (some hints, but no spoilers)

Hard Leetcode Problem: Grid Illumination