• 字符串计数


    字符串计数

    题目描述

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

    输入描述:

    每组数据包涵s1(长度小于100),s2(长度小于100),len1(小于100000),len2(大于len1,小于100000)

    输出描述:

    输出答案。
    示例1

    输入

    ab ce 1 2

    输出

    56

    牛客网题解:


    首先要搞清楚字典序的意思:即从两个字符串的下标为0开始进行对比,字典序是从左往右进行对比的。
    例如ab,abc这样两者之间的字符串个数为aba、abb,而ab、bb两者之间的字符串个数为:ac、ad、ae…az、ba这26个,所以高位的字符串个数要是26的i次幂。
    其次,要理解题目的“长度在len1到len2的字符串的个数”,指的是长度在len1的字符串个数、长度在len1+1的字符串个数。。。长度为len2的字符串个数。
    例abcde、acede这两个字符串,长度为1到4表示的是长度为1的时候两个字符a、a之间的个数,长度为2的时候两个字符ab、ac之间的个数,长度为3的时候abc、ace两个字符串之间的个数,长度为4:abcd、aced的个数。

    所以计算的时候应该以长度作为变量遍历len1到len2之间的字符串个数,最后相加。
     
     
     3 
     4 private static int process(String str1, String str2, int len1, int len2) {
     5         char[] ch1 = str1.toCharArray();
     6         char[] ch2 = str2.toCharArray();
     7         long res = 0;
     8         for (int i = len1; i <= len2; i++) {
     9             char a = ch1[0];
    10             char b = ch2[0];
    11             res += (long) Math.pow(26, i - 1) * (b - a);
    12             long suma = 0;
    13             long sumb = 0;
    14             for (int j = 1; j < ch1.length; j++)// 找到比ch1剩余字符串小的字符串个数
    15             {
    16                 suma = suma + (ch1[j] - 'a') * (long) Math.pow(26, i - 1 - j);
    17             }
    18             for (int j = 1; j < ch2.length; j++)// 找到比ch2剩余字符串小的字符串个数
    19             {
    20                 sumb = sumb + (ch2[j] - 'a') * (long) Math.pow(26, i - 1 - j);
    21             }
    22             res = res + sumb - suma;
    23         }
    24         res--;
    25         res= res % 1000007;
    26         return (int) res;
    27     }
     1 #include<iostream>
     2 #include<string>
     3 #include<vector>
     4 #include<math.h>
     5 using namespace std;
     6  
     7 int main(){
     8     //根据题中给出的例子,这个字符串只包含小写字母,不然答案就不应该是56了
     9     string s1,s2;
    10     int len1,len2;
    11     while(cin>>s1>>s2>>len1>>len2){
    12         //只包含小写字母的字符串可以看成26进制的数制
    13         //将s1和s2补长到len2长度
    14         s1.append(len2-s1.size(),'a');
    15         s2.append(len2-s2.size(),(char)('z'+1));
    16         vector<int> array;
    17         for(int i=0;i<len2;i++){
    18             array.push_back(s2[i]-s1[i]);
    19         }
    20         int result = 0;
    21         for(int i=len1;i<=len2;i++){
    22             for(int k=0;k<i;k++){
    23                 result += array[k]*pow(26,i-1-k);
    24             }
    25         }
    26         //所有字符串最后都不包含是s2自身,所以最后要减1;
    27         cout<<result-1<<endl;
    28     }
    29     return 0;
    30 }
  • 相关阅读:
    面向对象property属性、静态方法和类方法
    【枚举】枚举简单使用
    【Mac】Mac快捷键与Mac下的Idea快捷键
    @PostConstruct注解
    【通过ssh oracle11g安装】centos6静默安装oracle11g
    【Zookeeper02】ZK的作用以及使用
    【linux杂记】Ubuntu查看端口使用情况
    【数据结构--二叉树】Java递归实现二叉树遍历
    【python3两小时根本不够】入门笔记04:线程+Lock安全同步
    【python3两小时快速入门】入门笔记03:简单爬虫+多线程爬虫
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7728526.html
Copyright © 2020-2023  润新知