LeetCode 1416. 恢复数组(动态规划)

54 篇文章 0 订阅

1.题目

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

给你字符串 s 和整数 k 。可能会有多种不同的数组恢复结果。
按照上述程序,请你返回所有可能输出字符串 s 的数组方案数。
由于数组方案数可能会很大,请你返回它对 10^9 + 7 取余 后的结果。

示例 1:

输入:s = "1000", k = 10000
输出:1
解释:唯一一种可能的数组方案是 [1000]
示例 2:

输入:s = "1000", k = 10
输出:0
解释:不存在任何数组方案满足所有整数都 >= 1<= 10 同时输出结果为 s 。
示例 3:

输入:s = "1317", k = 2000
输出:8
解释:可行的数组方案为 [1317][131,7][13,17][1,317][13,1,7][1,31,7][1,3,17][1,3,1,7]
示例 4:

输入:s = "2020", k = 30
输出:1
解释:唯一可能的数组方案是 [20,20][2020] 不是可行的数组方案,原因是 2020 > 30[2,020] 也不是可行的数组方案,因为 020 含有前导 0 。
示例 5:

输入:s = "1234567890", k = 90
输出:34
 

提示:

1 <= s.length <= 10^5.
s 只包含数字且不包含前导 01 <= k <= 10^9.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-the-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.题解

思路:

方法:开一个dp数组,从后向前遍历,dp[i]代表从原字符串下标为i的位置遍历到末尾有多少种拆分方法。

  • 注意边界条件,如果i=len(s)表示遍历结束有可行解;如果当前的字符是’0’,那么必然无解。
class Solution
{
public:
    int numberOfArrays(string s, int k)
    {
        int n = s.size(), mod = 1000000007;
        vector<int> dp(n + 1);
        dp[n] = 1;

        for (int i = n - 1; ~i; i--)
        {
            if (s[i] == '0') continue;
            for (long t = 1, cur = 0; i + t <= n; t++)
            {
                cur = cur * 10 + s[i + t - 1] - '0';
                if (cur > k) break;
                dp[i] = (dp[i] + dp[i + t]) % mod;
            }
        }
        return dp[0];
    }
};

链接:https://blog.csdn.net/qq_17550379/article/details/105654028

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值