問題
英小文字だけでs をs の
- 1 回しか
出ない 文字が 無い ときは -1を返します sの長さは 0 以上 10000 以下です
入力と出力の例
例 1
a と b は 2
入力
s = "aabcb"出力
3例 2
k と a は 2
入力
s = "kayak"出力
2例 3
どの
入力
s = "xyzzyx"出力
-1面接での聞かれ方
面接では、
- 「文字列の
中で、 重ならない 最初の 文字の 位置を 返してください」 - 書き終えた
あとに 「いまの 書き方の 計算量は?」 「もっと 速く できますか?」と 続けて 聞かれます - 「無い
ときは 何を 返しますか?」と、 答えが 無い 場合を 聞かれる こともあります
位置を
まず 考える手順
段 1
まずは
段 2
何度もdict、Map) に
段 3
数え終えたら、-1 を
ここから解答です。先に自分で書いてから読むと、考え方が残ります。
解答
Python
Python
def first_unique_index(s):
count = {}
for ch in s:
seen = count.get(ch, 0)
count[ch] = seen + 1
for i, ch in enumerate(s):
if count[ch] == 1:
return i
return -1JavaScript
JavaScript
function firstUniqueIndex(s) {
const n = s.length;
const count = new Map();
for (const ch of s) {
const c = count.get(ch);
count.set(ch, (c ?? 0) + 1);
}
for (let i = 0; i < n; i++) {
if (count.get(s[i]) === 1) {
return i;
}
}
return -1;
}1 回目で
計算量
- 時間は O(n) です。
文字列を 2 回読みますが、 2 回は 定数なので O(n) と書きます - 使う
記憶は、 文字の 種類の 数だけです。 英小文字なら 多くても 26 種類なので、 O(1) と 見なせます - 段 1 の、
文字ごとに 全体を 読み直す 書き方は、 時間が O(n²)、 記憶は O(1) です
よく ある間違い
- 辞書の
並びから 答えを探す。 2 回目を 辞書の 中身で 回すと、 文字の 位置が 分かりません。 位置を 知る ために、 2 回目も 元の 文字列を 前から読みます - 1 回の
読みで 済ませようとする。 読みながら 「まだ 1 回しか 出ていない 文字」を 答えに すると、 あとで 2 回目が 出てきた ときに 間違えます。 例 2 の kayakで、最初の k を 答えてしまいます - 無い
ときの 戻り値を 書き忘れる。 繰り返しを 抜けた あとに -1を返す行が 無いと、 Python は None、JavaScript は undefinedを返します
面接での 話し方の例
書き始める
「文字ごとに
全体を 読み直せば O(n²) で 解けます。 ただ、 知りたいのは 文字ごとの 回数なので、 先に 1 回読んで 辞書に 数えて おきます。 その あと 前から もう 1 回読み、 回数が 1 の 文字に 最初に 当たった 位置を 返します。 時間は O(n) です。」
書き終えたら、
「例 2 の
kayakでたどります。 1 回目で、 k が 2 回、 a が 2 回、 y が 1 回と 数えます。 2 回目は 前から 見て、 k も a も 2 回なので 飛ばし、 2 番の y が 1 回なので 2 を 返します。」
