今回は paiza の「【文字列 1】疑似数字」の問題に挑戦!
問題概要
◯ 入力
-
英小文字と数字(0~9)からなる文字列
Sが与えられる。 -
「疑似数字」とは 先頭と末尾が数字である部分文字列 を指す。
-
1文字の数字も「疑似数字」とみなす。
◯ 出力
以下の順序で行う:
- 文字列
Sの1文字目を始点とする全ての疑似数字(終了位置が近い順)。 - 次に2文字目を始点とする疑似数字(同様に終了位置が近い順)。
- これを文字列の最後まで繰り返す。
入力例:
81zaaz18
出力例:
8
81
81zaaz1
81zaaz18
1
1zaaz1
1zaaz18
1
18
8
✅ OK例:
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const S = lines[0]; // 入力文字列
const result = [];
// i: 開始位置
for (let i = 0; i < S.length; i++) {
if (!isNaN(S[i])) { // 開始文字が数字かどうか
// j: 終了位置(iから右に伸ばす)
for (let j = i; j < S.length; j++) {
if (!isNaN(S[j])) {
// i から j までの部分文字列
const substr = S.slice(i, j + 1);
result.push(substr);
}
}
}
}
// 改行で出力
console.log(result.join("\n"));
});
-
isNaN(x)はxが数字ならfalseを返すので、!isNaN(x)が「数字判定」になる。 -
二重ループ
- 外側ループ
i: 開始位置 - 内側ループ
j: 終了位置 -
iとjが数字ならその区間をsliceで抜き出すだけ。
- 外側ループ
🗒️ まとめ
🔹 疑似数字の定義
- 部分文字列の先頭と末尾が数字。
- 長さ1の数字もOK。
🔹 実装の基本戦略
- 開始位置
iを決めるループ-
S[i]が数字なら探索開始。
-
- 終了位置
jを決めるループ-
S[j]が数字なら「S[i..j]」が疑似数字。 -
sliceを使って部分文字列を抽出できる。
-
🔹 数字判定
-
!isNaN(S[i])が「数字かどうか」の判定になる。
🔹 出力順序
- 「開始位置ごとに、終了位置が近い順」で出すのがポイント。
- そのため、内側ループは i から右に順に伸ばしていけば自然に順序が正しくなる。