数字串中指定范围数值的所有有效组合计数问题求解
解决思路:动态规划
核心用动态规划(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] = 1i=1(子串"1"):数值1<2,无效,dp[1] = 0i=2(子串"13"):- j=0:"13"符合条件,
dp[2] += dp[0] = 1 - j=1:"3"符合条件,但
dp[1]=0,最终dp[2] = 1
- j=0:"13"符合条件,
i=3(子串"133"):- j=0:"133"符合条件,
dp[3] += dp[0] =1 - j=2:"3"符合条件,
dp[3] += dp[2] =1,最终dp[3] =2
- j=0:"133"符合条件,
i=4(子串"1337"):- j=0:"1337"符合条件,
dp[4] +=1 - j=2:"37"符合条件,
dp[4] +=1 - j=3:"7"符合条件,
dp[4] +=2
最终dp[4] =4,与示例结果一致。
- j=0:"1337"符合条件,
示例2:数字串"405",下界0,上界100,数值不含0、无前导0
注:示例中{40,5}有效,推测题目条件表述为数值无前导0且本身不为0(而非数值不含0),按此验证:
dp[0] =1i=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
相关产品推荐
相关产品推荐

