Skip to content

1416. Restore The Array

思路

  • 对于每次分割,都可以看成是前半段和后半段

  • 前半段是确定的,可以用start和end取出来

  • 后半段是一个递归函数

  • 直到不剩下的时候,总数可以+1

  • 如果过程中出现了开头是0,那么直接结束

  • 前半段如果大于k了,那么,说明这里不能分割,后面的结果都不用看了

代码

class Solution {
    private int mod = (int) 1_000_000_007;
    private int get(int start, String s, int k, int[] dp){
        if(dp[start] != 0){
            return dp[start];
        }
        int count = 0;

        if(start == s.length()){
            return 1;
        }

        if(s.charAt(start) == '0'){
            return 0;
        }

        for(int end = start; end < s.length(); end++){
            Long num = Long.parseLong(s.substring(start, end + 1));
            if(num > k){
                break;
            }
            // System.out.println(count);
            count = (count + get(end + 1, s, k, dp)) % mod;
        }

        dp[start] = count;
        return count;
    }

    public int numberOfArrays(String s, int k) {
        return get(0, s, k, new int[s.length() + 1]);
    }
}