LeetCode: Decrypt String from Alphabet to Integer Mapping

Question

Given a string s formed by digits (‘0’ - ‘9’) and ‘#’ . We want to map s to English lowercase characters as follows:

Characters (‘a’ to ‘i’) are represented by (‘1’ to ‘9’) respectively. Characters (‘j’ to ‘z’) are represented by (‘10#’ to ‘26#’) respectively. Return the string formed after mapping.

It’s guaranteed that a unique mapping will always exist.

Example 1:
Input: s = "10#11#12"
Output: "jkab"
Explanation: "j" -> "10#" , "k" -> "11#" , "a" -> "1" , "b" -> "2".

Example 2:
Input: s = "12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#"
Output: "abcdefghijklmnopqrstuvwxyz"

Solution#1

def freq_alphabets(s)
  dict = {}
  ans = []
  counter = 1
  length = s.length-1
  j = length

  ('a'..'z').each do |i|
    if counter < 10
      dict["#{counter}"] = i
    else
      dict["#{counter}#"] = i
    end
    counter += 1
  end

  while j >= 0
    if s[j] == "#"
      ans << dict[s[j-2..j]]
      j -= 2
    else
      ans << dict[s[j]]
    end
    j -= 1
  end
  ans.reverse.join
end

Solution#2

def freq_alphabets(s) 
  tmp = decrypt(s, /(\d{2}#)/)
  decrypt(tmp, /(\d)/)
end

def decrypt(string, pattern)
  string.gsub(pattern) do |x|
    ($1.to_i + 96).chr
  end
end