You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数字串中指定范围数值的所有有效组合计数问题求解

解决思路:动态规划

核心用动态规划(DP)统计所有有效拆分的数量,步骤如下:

1. 定义DP数组

设dp[i]表示数字串前i个字符组成的子串的有效组合数量。数组长度为n+1(n是数字串长度),初始状态dp[0] = 1——空字符串有一种合法拆分方式(无任何数值的空组合)。

2. 遍历计算DP值

对每个位置i(从1到n),向前遍历所有可能的拆分起点j(从0到i-1),检查子串s[j:i](对应原数字串第j到i-1位)是否满足全部条件:

  • 无前导0:若子串长度大于1,第一个字符不能是'0'
  • 数值不含0:子串中不能出现'0'
  • 数值在上下界内:将子串转为整数后,需满足下界 ≤ 数值 ≤ 上界

如果满足所有条件,就把dp[j]的值累加到dp[i]中——前j个字符的有效组合,加上当前合法数值,就是前i个字符的一种有效组合。

3. 最终结果

dp[n]即为整个数字串的有效组合总数。


示例验证

示例1:数字串"1337",下界2,上界1500

  • dp[0] = 1
  • i=1(子串"1"):数值1<2,无效,dp[1] = 0
  • i=2(子串"13"):
    • j=0:"13"符合条件,dp[2] += dp[0] = 1
    • j=1:"3"符合条件,但dp[1]=0,最终dp[2] = 1
  • i=3(子串"133"):
    • j=0:"133"符合条件,dp[3] += dp[0] =1
    • j=2:"3"符合条件,dp[3] += dp[2] =1,最终dp[3] =2
  • i=4(子串"1337"):
    • j=0:"1337"符合条件,dp[4] +=1
    • j=2:"37"符合条件,dp[4] +=1
    • j=3:"7"符合条件,dp[4] +=2
      最终dp[4] =4,与示例结果一致。

示例2:数字串"405",下界0,上界100,数值不含0、无前导0

注:示例中{40,5}有效,推测题目条件表述为数值无前导0且本身不为0(而非数值不含0),按此验证:

  • dp[0] =1
  • i=3时,仅j=1的拆分有效:前1个字符"4"无法和后续"05"组成有效组合("0"无效、"05"有前导0);j=2时前2个字符"40"若符合条件(允许含0),则dp[3] += dp[2],但只有j=1时拆分出的"40"+"5"完全合法,最终dp[3] =1,与示例结果一致。

实现注意事项

  • 大数处理:若数字串过长,转整数易溢出,可直接用字符串和上下界的字符串形式对比(先比长度,长度相同再逐位比较)
  • 剪枝优化:若子串长度超过上界的位数,直接跳过(比如上界是1500,4位数,超过4位的子串必然无效)
  • 提前过滤:子串中若含'0',直接判定为无效,无需后续数值范围判断

内容的提问来源于stack exchange,提问作者rasoolZero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:36:28