请你仔细阅读题目,某个程序本来应该输出一个整数数组。但是这个程序忘记输出空格了以致输出了一个数字字符串,我们所知道的信息只有:数组中所有整数都在 [1, k] 之间,且数组中的数字都没有前导 0 ,

请你仔细阅读题目,某个程序本来应该输出一个整数数组。但是这个程序忘记输出空格了以致输出了一个数字字符串,我们所知道的信息只有:数组中所有整数都在 [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]。最后,我们将 dp[i]MOD 取模,确保结果在合适的范围内。

最终,我们返回 dp[n],即字符串的长度为 n 时的方案数。

这个解题思路通过动态规划的方式,逐步计算出字符串中每个位置的方案数,并利用之前计算的结果进行累加。

这样可以避免重复计算,并最终得到正确的结果。

猜你喜欢

转载自blog.csdn.net/weixin_48674314/article/details/130774256