質問をよく読んでください あるプログラムは整数の配列を出力することになっています。しかし、このプログラムはスペースを出力するのを忘れたため、数値文字列を出力しました。私たちが知っている唯一の情報は、配列内のすべての整数が [1, k] の間にあり、配列内の数値の先頭に 0 がないことです。文字列 s と整数 k。配列の復元結果は多種多様である可能性があります。上記の手順に従って、文字列 s を出力する可能性のある配列解の数を返してください。配列解の数が非常に多くなる可能性があるため、10^9 + 7 の余りを返してください。 . 最終結果。
ヒント: 条件 1 <= s.length <= 10^5、s には数値のみが含まれ、先頭の 0、1 <= k <= 10^9 は含まれません。
var numberOfArrays = function(s, k) {
const MOD = 1e9 + 7;
const n = s.length;
const dp = new Array(n + 1).fill(0);
dp[0] = 1;
for (let i = 1; i <= n; i++) {
for (let j = i - 1; j >= 0 && i - j <= String(k).length; j--) {
if (s[j] === '0') continue;
const num = Number(s.slice(j, i));
if (num > k) break;
dp[i] = (dp[i] + dp[j]) % MOD;
}
}
return dp[n];
};
// 示例使用:
const s = "1111111111111";
const k = 1000000000;
const result = numberOfArrays(s, k);
console.log(`数组方案数为:${result}`);
この問題は動的計画法を使用して解決できます。
以前の文字を数値に復元するためのオプションの数を表すdp
配列を定義します。の場合、範囲内にある以前の位置を反復する必要があります。dp[i]
i
dp[i]
j
j
[i - kLen, i)
s
文字列の部分文字列をs[j, i]
数値に変換しnum
、条件が満たされるかどうかを判断します。num <= k
先頭に 0 が含まれていません。
条件が満たされる場合、dp[j]
現在の位置のオプションの数dp[i]
、つまり にオプションの数を追加しますdp[i] += dp[j]
。最後に、 modulo をdp[i]
実行してMOD
、結果が適切な範囲内にあることを確認します。
最後に、文字列の長さが のときの解の数 をdp[n]
返します。n
この問題解決のアイデアは、動的プログラミングを使用して文字列内の各位置の解の数を段階的に計算し、以前の計算結果を使用して蓄積します。
これにより、二重計算が回避され、正しい結果が得られます。