動的計画法で 数字だけの 暗号を 文字に 戻す読み方を数える
A を
海外で定番の問題リスト 4 本には入っていません
問題
英大文字を、digits を
- 1 文字は、
1 桁 (1 から 9) か 2 桁 (10 から 26) の数です 0で始まる 区切り ( 0だけ、05など) は、 どの 文字にも 当たりません - どう
区切っても 読めない ときは 0 を返します digitsの長さは 1 以上 100 以下で、 答えは 2^31 より 小さくなる ものとします
入力と出力の例
例 1
1-2-2-6 (ABBF)、
例 2
0 は 1 文字に20 と
例 3
0 は3 と
面接での聞かれ方
面接では、
- 「A を 1、
Z を 26 とした 暗号の 数字列は、 何通りに 読めますか」 - 書く
前に 「 06は 6 と読めますか?」 「読めない ときは 何を 返しますか?」と 確かめられるかを 見られます - 書き終えると
「 0がたくさん 入った 例で 確かめてください」と、 端の 場合を 手で たどるよう 求められます
正しい0 の
ヒント
まだ開いていません
付箋は 4 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3
ヒント 4答えに近い
アルゴリズムのチートシートの「動的計画法 (DP)」に、
関わる学び
動的計画法は、
まず 考える手順
段 1
区切り方を
段 2
前から i 桁をways[i] とways[i-1] 通りをways[i-2] 通りを
段 3
ways[0] (何も0 の10 か 20 のways[i] は 0 に
段 4
使うのは
解答
Python
Python
def decode_count(digits):
far, near = 1, 1
prev = "0"
for d in digits:
here = 0
if d != "0":
here += near
pair = prev + d
if "10" <= pair <= "26":
here += far
far, near = near, here
prev = d
return nearJavaScript
JavaScript
function decodeCount(digits) {
let far = 1;
let near = 1;
let prev = "0";
for (const d of digits) {
let here = 0;
if (d !== "0") {
here += near;
}
const v = Number(prev + d);
if (v >= 10 && v <= 26) {
here += far;
}
far = near;
near = here;
prev = d;
}
return near;
}Go
Go
func decodeCount(
digits string,
) int {
far, near := 1, 1
prev := byte('0')
b := []byte(digits)
for _, d := range b {
here := 0
if d != '0' {
here += near
}
v := int(prev-'0') * 10
v += int(d - '0')
if v >= 10 && v <= 26 {
here += far
}
far, near = near, here
prev = d
}
return near
}near はfar はprev は 1 つ前の0 に0 で05 のような 0 で
計算量
- 時間は O(n) です (n は
digitsの長さ)。 1 桁ずつ 1 回見ます - 使う
記憶は O(1) です。 持つのは 変数 2 つだけです waysの表を 全部持つ 書き方も 時間は 同じで、 記憶が O(n) になります
よく ある間違い
0を 1 桁の文字として数える。 1 桁は 1 から 9 だけです。 例 3 で 0 でない 数を 返したら、 この 間違いです - 2 桁を 26 以下かだけで
確かめる。 05は 5 として 26 以下なので、10 以上かも 見ないと "105"を 2 通りと数えてしまいます。 答えは 10-5 の 1 通りです - 文字列を
はじめに 整数へ直す。 "06"を整数に すると 先頭の 0が消えて 6 に なり、 1 通りと 数えてしまいます。 0で始まる 区切りは 読めないので 0 です。 桁は 文字のまま 1 つずつ見ます - 続く
0を見落とす。 "100"は、2 桁目までは 10 の 1 通りでも、 3 桁目の 0は 1 桁にも、前と 組んだ 00にもならないので 0 です
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「前から i 桁の
読み方の 数を 考えると、 最後の 文字は 1 桁か 2 桁です。 1 桁が 1 から 9 なら 1 つ前の 数を、 2 桁が 10 から 26 なら 2 つ前の 数を 足します。 空を 1 通りとして 始め、 使うのは 前の 2 つだけなので、 時間は O(n)、 記憶は O(1) です。」
書き終えたら、
「例 1 の
1226でたどります。 空と 1 桁目の 1 は 1 通り、 2 桁目の 2 は 1 桁で 1、 12 で 1 を 足して 2、 3 桁目の 2 は 1 桁で 2、 22 で 1 を 足して 3、 4 桁目の 6 は 1 桁で 3、 26 で 2 を 足して 5 です。」