0
点赞
收藏
分享

微信扫一扫

leetcode-划分数字的方案数


你写下了若干 正整数 ,并将它们连接成了一个字符串 num 。但是你忘记给这些数字之间加逗号了。你只记得这一列数字是 非递减 的且 没有 任何数字有前导 0 。

请你返回有多少种可能的 正整数数组 可以得到字符串 num 。由于答案可能很大,将结果对 109 + 7 取余 后返回。

示例 1:

输入:num = “327”
输出:2
解释:以下为可能的方案:
3, 27
327
示例 2:

输入:num = “094”
输出:0
解释:不能有数字有前导 0 ,且所有数字均为正数。
示例 3:

输入:num = “0”
输出:0
解释:不能有数字有前导 0 ,且所有数字均为正数。
示例 4:

输入:num = “9999999999999”
输出:101

提示:

1 <= num.length <= 3500
num 只含有数字 ‘0’ 到 ‘9’ 。

java代码:

class Solution {
    int mod=1000000007;
    public int numberOfCombinations(String num) {
        int n=num.length();
        int[][] compare=new int[n][n];
        for (int i=0;i<n-1;i++){
            if (num.charAt(i)>num.charAt(i+1)){
                compare[i][i]=1;
            } else if (num.charAt(i)==num.charAt(i+1)){
                compare[i][i]=0;
            } else {
                compare[i][i]=-1;
            }
        }
        for (int i=2;i<=n/2;i++){
            int eqFront=0;
            int curCompare=-2;
            int j=0;
            for (j=n-i*2;j<n-i&&num.charAt(j)==num.charAt(j+i);j++){
                eqFront++;
            }
            if (j==n-i){
                curCompare=0;
            } else {
                if (num.charAt(j)>num.charAt(j+i)){
                    curCompare=1;
                } else {
                    curCompare=-1;
                }
            }
            compare[n-i*2][n-i-1]=curCompare;
            for (j=n-i*2-1;j>=0;j--){
                if (num.charAt(j)==num.charAt(j+i)){
                    eqFront++;
                    if (eqFront>=i){
                        compare[j][j+i-1]=0;
                    } else {
                        compare[j][j+i-1]=compare[j+1][j+i];
                    }
                } else {
                    eqFront=0;
                    if (num.charAt(j)>num.charAt(j+i)){
                        compare[j][j+i-1]=1;
                    } else {
                        compare[j][j+i-1]=-1;
                    }
                }
            }
        }
        // for (int i=0;i<n;i++){
        //     for (int j=0;j<n;j++){
        //         System.out.print(compare[i][j]+" ");
        //     }
        //     System.out.println();
        // }
        long[][] ways=new long[n][n];
        if (num.charAt(0)=='0'){
            return 0;
        }
        for (int i=0;i<n;i++){
            ways[0][i]=1;
        }
        for (int i=1;i<n;i++){
            if (num.charAt(i)!='0'){
                long sum=0L;
                int k=i;
                for (int j=i;j<n;j++){
                        if (k>0&&(i-k)<(j-i)){
                            k--;
                            sum+=ways[k][i-1];
                        }
                        if (k>0&&compare[k-1][i-1]<=0){
                            k--;
                            sum+=ways[k][i-1];
                        } 
                    sum%=mod;
                    ways[i][j]=sum;
                    
                }
            }
        }
        long ans=0L;
        for (int i=0;i<n;i++){
            ans=ans+ways[i][n-1];
           // System.out.println(ways[i][n-1]);
            ans%=mod;
        }
        return (int)ans;
    }
}


举报

相关推荐

0 条评论