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

来源:互联网 发布:linux中rpm是什么意思 编辑:程序博客网 时间:2024/05/18 00:08

题目描述

求字典序在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);                    }    }}


0 0