Swift教室 Swift と競技プログラミングの教室

15. First Unique Character in a String

読了目安 約1分

HashMap / LeetCode 387 (Easy) — 出現回数を辞書で数え、2 回目の走査で最初の一意な文字を探す。

この章の目次

問題

LeetCode 387. First Unique Character in a String(Easy / カテゴリ: HashMap)

文字列 s が与えられます。 s の中で 1 回しか登場しない文字のうち、最初に現れるものの添字を返します。 そのような文字がなければ -1 を返します。

考え方

ヒント 1

前から 1 回見るだけでは、その文字が後ろでもう一度出てくるかが分かりません。 走査を 2 回に分けます。

ヒント 2

1 回目の走査で、各文字の出現回数を辞書に数えます。 2 回目の走査で、回数が 1 の最初の文字を探します。

Swift 実装のポイント

  • 出現回数は count[c, default: 0] += 1 で数えます。キーは Character です。
  • Swift の String は整数の添字でアクセスできません。位置が欲しいときは for (i, c) in s.enumerated() を使います。
模範解答
Swift
class Solution {
    func firstUniqChar(_ s: String) -> Int {
        var count: [Character: Int] = [:]
        for c in s {
            count[c, default: 0] += 1
        }
        for (i, c) in s.enumerated() {
            if count[c] == 1 {
                return i
            }
        }
        return -1
    }
}

計算量: O(n)(文字列を 2 回走査します)。