你写下了若干 正整数 ,并将它们连接成了一个字符串 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;
}
}