LeetCode: First Unique Character in a String

Question

在字串中找出第一個 “唯一” 的字,並回傳它的位置。如果都是重複的字,就會回傳 -1

Given a string, find the first non-repeating character in it and return it’s index. If it doesn’t exist, return -1.

Examples:
s = "leetcode" # return 0

s = “loveleetcode” # return 2.

Note: You may assume the string contain only lowercase letters.

Solution

首先需要用 split(“”) 方法把傳進來的字串分開來,並且指定給 arr_string。 如此一來,每個單一字母就能夠被比對和計算出現的次數。

我選擇用 Hash 來記錄比對的資訊(key 是字母, value是出現的次數)。 這裡要記得給 Hash 初始值為 0,否則你會得到以下錯誤訊息:

undefined method `+' for nil:NilClass (NoMethodError)

因為在預設的狀態下,Hash 的初始值是 nil。

再以 each 方法,逐個地從 arr_string(Array 型態)轉出來,當作 Hash 的 key。 如果遇到重複的字母出現,Hash 會比對 key 然後在 value 的值增加 1。

當 each 方法跑完之後,代表已經紀錄完成每個字母出現的次數了。 因為題目要的是 “唯一” 代表的就是出現過一次的字母,所以要找在 Hash 裡 value 為 1 的 key。最後使用了 Array 提供的 index 方法,便可以輕鬆地以字母找到正確位置。

def first_uniq_char(str)
  arr_string = str.split('')
  counter = Hash.new(0)

  arr_string.each do |chr|
    counter['chr'] += 1
  end
  position = arr_string.index(counter.key(1))
  position || -1
end