美团--字符串计数
美團(tuán)–字符串計(jì)數(shù)
文章目錄
- 美團(tuán)--字符串計(jì)數(shù)
- 一、題目描述
- 二、分析
- 三、代碼
一、題目描述
二、分析
- 做題之前我們需要明白什么是字典序,就以題目中的事例1來(lái)說(shuō),字典序在ab和ce之間并且滿足長(zhǎng)度在1到2之間的所有字符串的個(gè)數(shù)
首先,ab的下一個(gè)字典序是什么?是aba,abb,abc…但是發(fā)現(xiàn)長(zhǎng)度不滿足;
所以ab真正的下一個(gè)字典序是ac,同樣對(duì)于aca,acb,…也是不滿足情況的,所以ac的下一個(gè)字典序是ad,ae,…az(24);
同理az的下一個(gè)字典序是b,ba,bb,bc,…bz(27);
bz的下一個(gè)字典序是c,ca,cb,cc,cd(5)
所以ab和ce之間的
題意:ab ce : 1 - 2
ac ad … az : 24
b ba bb … bz : 27
c ca cb cc cd : 5
- 現(xiàn)在明確了字典序,根據(jù)上面對(duì)用例對(duì)分析,說(shuō)明題意中只有小寫字母,現(xiàn)在假設(shè)其中一個(gè)為 str1 = cpqejrrgp, str2 = cpqejtrdg,len1 = 9, len2 = 9,設(shè)所求滿足情況的字符串代號(hào)為 str
- 第一步:首先找到兩個(gè)字符串相對(duì)應(yīng)位置的第一個(gè)不相等的位置,即若ab 和 ce,第一個(gè)相對(duì)位置不相等的為值就是下標(biāo)為0的地方 a 和 c 不一樣,str1和str2中第一個(gè)相對(duì)不相等的位置是下標(biāo)為5的地方,即 r 和 t,設(shè)下標(biāo)為k
- 第二步:先求在此下標(biāo)處,字符處于下標(biāo)位置字符之間的情況,即str[k]>str1[k] && str[k]<str2[k]的情況,這個(gè)最好算,只要k位置大于str1小于str2對(duì)應(yīng)的k位置,后面的任一位置可以隨意取,每個(gè)位置有26種
- 例如str1[5]和str2[5]之間共有num1種(‘t’-‘r’-1=1種即為’s’這一種情況),str[5]為s的時(shí)候,后面三位可以隨意取;共有(str2[k] - str1[k] - 1)*pow(26, i - k)種,
其中i為len1到len2之間的取值,這里用一個(gè)for循環(huán)累加; - 第三步:其次再求str[k]==str1[k]時(shí)有多少種,此時(shí),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]的情況,此時(shí),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;const int mod = 1000007;int main() {string str1,str2;int len1,len2;while(cin>>str1>>str2>>len1>>len2){//補(bǔ)全str1為滿足題意的開(kāi)始字典序if(str1.length() < len2)str1.append(len2 - str1.length(),'a');//補(bǔ)全str2為滿足題意的結(jié)束字典序if(str2.length() < len2)str2.append(len2 - str2.length(),'z');//保存結(jié)果int sum = 0;//標(biāo)記第一個(gè)不想等的位置int k = 0;//第一步,找第一個(gè)相對(duì)位置不相等的位置下標(biāo)while(str1[k] == str2[k]){k++;}//第一種情況,字符介于str1和str2之間if(str1[k] < str2[k] && len1 <= len2){//第二步,計(jì)算str[k]>str1[k] && str[k]<str2[k]的情況for(int i = len1 - 1;i < len2;i++){if(i == k){if(k == len1 - 1 && k == len2 - 1)sum += str2[k] - str1[k] - 1;elsesum += str2[k] - str1[k];}elsesum += ((str2[k] - str1[k] - 1)*(int)pow(26,i - k)) % mod;}k++;//第三步,計(jì)算str[k]==str1[k]時(shí)的情況和str[k]==str2[k]的情況for(int i = len1;i <= len2;i++){ for(int j = k;j < i;j++)sum += (('z' - str1[j]) * (int)pow(26,i - j - 1)) % mod;for(int j = k;j < i;j++)sum += ((str2[j] - 'a') * (int)pow(26,i - j - 1)) % mod;}}cout << sum % mod << endl;}return 0; }總結(jié)