字符串字典序个数问题

问题:两个字符串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

相关推荐

nbdy:字太多了,写简历不是写自传,亮点难点技能点列出来就行,要简明扼要
点赞 评论 收藏
分享
01-15 17:34
保定学院 Java
数学转码崽:学历没优势就得卷项目和实习啊,但是我看了一下你这个项目,什么雪花算法,搜索引擎,Docker,minio这些都属于通用的东西啊,根本不算亮点,没有任何业务相关性。 还有第二个看到统一鉴权,分片上传估计面试官都不想看了。连我一个偶尔刷刷牛客简历的都看多了,面试官估计早都看吐了。。。 秋招结束了,就尽量找找中小厂吧,毕竟你现在转行已经没时间了,高低有一段实习经历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务