字符串计数-复杂的动态规划题 解析以及Java代码实现

题目描述

求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。

题目分析:

1对于字典序的理解 是从首字母第一个开始比较的

2.对于此题我们可以想到要求不同长度的字符串的个数 也就是常用的动态规划 对于每一个长度我们分为3部分来求解 

   比如对于abc 到efg 我们可以这么来求解 对于长度1就不说了 a b c d e

   对于长度2 我们可以求a 到e 长度为2的差 为(e-a)*pow(26,1)  a到ab 这中间还有个计数  我们需要减去  e到ef也有个计数我们需要加上

3. 我们要注意溢出,最后需要减1

源代码如下:

import java.util.*;
public class Main
{
    public static void main(String args[])
    {
        Scanner in=new Scanner(System.in);
        while(in.hasNextLine())
        {
            String[] line=in.nextLine().split(" ");
            String s1=line[0];
            String s2=line[1];
            int len1=Integer.valueOf(line[2]);
            int len2=Integer.valueOf(line[3]);
            char[] a=s1.toCharArray();
            char[] b=s2.toCharArray();
            int t=b[0]-a[0];
            long sum=0;
            for(int i=len1;i<=len2;i++)
            {
                sum+=t*(long)Math.pow(26,i-1);
                long suma=0; 
                int min=Math.min(i,a.length);
                for(int j=1;j<min;j++)
                {
                    int x=a[j]-'a'+1;
                   suma+=x*(long)Math.pow(26,i-j-1);
                }
                long sumb=0;
                min=Math.min(i,b.length);
                for(int j=1;j<min;j++)
                {
                    int x=b[j]-'a'+1;
                    sumb+=x*(long)Math.pow(26,i-j-1);
                }
                sum=(sum+sumb-suma);
                
            }
            sum=(sum-1)%1000007;
            System.out.println(sum);
            
        }
    }
}
点赞