字符串字典序个数问题

问题:两个字符串a和b长度相同(只包含小写字母),长度为m,求字典序在a和b之间(包括a和b本身)长度为m 的字符串的个数。
例如,aa 到az之间存在26个字符串;aa 到ba则有27个字符串但我下面的代码的输出结果是错的,搞不清楚我的逻辑到底哪里错了。例如当a="kcnmi ";b="lgtqj"正确结果应该是531440,但我的结果是531442
C++代码:
string a="xxxx" ;
string b ="xxxx" ;
long long res =0 ;
reverse(a.begin (),a.end ()) ;
reverse(b.begin (),b.end ()) ;//为了循环方便把字符串给反转了
for(int i=0 ;i<m ;++i)
{
int gap = b[i]-a[i] ;
res+= pow(26,i)*gap ;
}
cout<<res+1<<endl ;//输出答案,因为最后一个字符就算相等也作为一种,所以加1



全部评论
//阿里的一道题,和你这个类似,原来借鉴楼主的方法,发现行不通,有很多情况没考虑到。我换了一种方法,代码略有欠缺,但可保证正确性,在空间上开销过大,但可以利用容器改进一下,我就不该进了,如果有人改进的话,麻烦发我一份。代码如下: #include<iostream> #include<algorithm> using namespace std; #include<string> #define maxn 5000 int main() { int T; int N[maxn] = { 0 }; string str1[maxn]; string str2[maxn]; cin >> T; for (int i = 0; i < T; ++i) { int n; int temp; cin >> temp; N[i] = temp; string s; cin >> s; str1[i] = s; cin >> s; str2[i] = s; } int res[maxn] = { -1 }; for (int i = 0; i < T; ++i) { string s1, s2; s1 = str1[i]; s2 = str2[i]; int r = 0; if (s1 >= s2) { res[i] = 0; } else { long long int test1=0, test2=0; for (int j = 0; j < N[i]; ++j) { test1 = (s1[j] - 96)+test1 * 26; test2 = (s2[j] - 96)+test2 * 26; } res[i] = test2-test1-1; } } for (int i = 0; i < T; ++i) { cout << res[i] << endl; } return 0; }
1 回复
分享
发布于 2020-08-26 10:47

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务