loading...

LeetCode in Ruby: 242. Valid Anagram

algobot76 profile image Kaitian Xie Updated on ・1 min read

Count

def is_anagram(s, t)
  return false unless s.length == t.length

  ('a'..'z').each do |char|
    return false unless s.count(char) == t.count(char)
  end

  true
end

The two strings s and t are anagrams if they have the same number of occurrences for each character. Even its time complexity is O(n^2), it’s faster than the latter two approaches.

Time complexity: O(n^2)

Extra memory: O(1)

Sort

def is_anagram(s, t)
  return false unless s.length == t.length

  s_ary = s.split('').sort
  t_ary = t.split('').sort

  (0...s.length).each do |index|
    return false if s_ary[index] != t_ary[index]
  end

  return true
end

We convert the strings s and t into two arrays: s_ary and t_ary, with characters being sorted. If s and t are anagrams, then s_ary and t_ary must have the same character for each index. This is what the loop is checking.

Time complexity: O(nlgn)

Extra memory: O(n)

Sort (A Faster Variant)

def is_anagram(s, t)
  return false unless s.length == t.length

  s.bytes.sort! == t.bytes.sort!
end

This is the same as the previous one, except that we aren’t comparing characters but bytes.

Time complexity: O(nlgn)

Extra memory: O(n)

Discussion

pic
Editor guide