Longest distinct sub-array
Write a program that takes as input an array and returns the length of the longest sub-array with the property that all its elements are distinct.
Example
Input: f,s,f,e,t,w,e,n,w,e
Output: 5 (s,f,e,t,w)
Solution
- Use a hash table to keep track of the last time an element was seen
- Parse through the array and keep track of the largest distinct array seen so far
- Each time we see an element that was seen before,
- Update the starting index of the current longest distinct array
- That is the index to the right of the last time the current element was seen
- Check if this length is greater than the longest distinct array we've seen so far
Code
# Returns length of the longest distinct array
def longest_distinct_array(array)
last_seen_hash = {}
max_length_so_far = 0
start_index = 0
while array.each.with_index do |e, i|
if last_seen = last_seen_hash[e]
if last_seen >= start_index
index = last_seen_hash[e] + 1
length = i - index
if length > max_length_so_far
max_length_so_far = length
end
start_index = last_seen + 1
end
else
last_seen_hash[e] = i
end
end
max_length_so_far
end
Complexity
- Time: O(n) since we are traversing the array only once
- Space O(n) maintaining the last seen hash for all distinct elements in the array