C++中append函数用法、字符串计数、最长公共子序列

本文介绍了C++中append函数的使用方法,包括追加字符、字符串等内容。同时,文章详细讲解了如何解决字符串计数问题,即在两个给定字符串之间寻找特定长度的字典序字符串数量,以及最长公共子序列问题的解决方案。通过实例展示了计算过程和代码实现。
摘要由CSDN通过智能技术生成
题目描述

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

输入描述:

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

输出描述:

输出答案。

示例:

输入
abc 1 2
输出
56

字典序排序:即从两个字符串的下标为0开始进行对比,字典序是从左往右进行对比的。
例如ab,abc这样一对之间的字符串个数为aba,abb,而ab,bb两者之间的串行个数为:ac,ad,ae … az,ba这26个,所以高位的字符串个数要是26的i次幂。

首先是从之前的几个测试样例分析,其中一个为 str1 = cpqejrrgp, str2 = cpqejtrdg , len1 = 9, len2 = 9,设所求满足情况的字符串代号为 str(str有35064种)。
第一步:首先找到两个字符串相对应位置的第一个不相等的位置,即若ab 和 ce。第一个相对位置不相等的为值就是下标为0的地方 a 和 c 不一样,str1和str2中第一个相对不相等的位置是下标为5的地方,即 r 和 t,设下标为k;
第二步:先求在此下标处,字符处于下标位置字符之间的情况,即str[k]>str1[k] && str[k]<str2[k]的情况,这个最好算,只要k位置大于str1小于str2对应的k位置,后面的任一位置可以随意取,每个位置有26种,例如str1[5]和str2[5]之间共有num1种(‘t’-‘r’-1=1种即为’s’这一种情况),str[5]为s的时候,后面三位可以随意取;共有(str2[k] - str1[k] - 1)*pow(26, i - k)种,其中i为len1到len2之间的取值,这里用一个for循环累加;
第三步:其次再求str[k]==str1[k]时有多少种,此时,str[k+1]需大于str1[k+1],k+2位,k+3位…可以随意取,接着再求str[k]==str1[k]&&str[k+1]str1[k+1]的情况,需str[k+2]大于str1[k+2],k+3以及之后的位置随意取,以此类推,直到算到klen2-1的位置为止;
第四步:最后求str[k]==str2[k]的情况,此时,str[k+1]需要小于str2[k+1],k+2,k+3等之后的位置随意取,接着再求str[k]==str2[k]&&str[k+1]str2[k+1]的情况,需要str[k+2]小于str2[k+2],后面的位置随意取,以此类推,直到算到klen2-1的位置为止;
第五步:把所有情况相加,注意还有几处边界位置需要处理,具体参考以下代码

代码:
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int main()
{
   
    string str1,str2;
    int len1,len2;
    while(cin>>str1>>str2>>len1>>len2)
    {
   
         if(str1.length()<len2)
             str1.append(len2-str1.length(),'a'-1);
          if(str2.length()<len2)
              str2.append(len2-str2.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值