我想出下面的程序来检查两个字符串是否是字谜。它对于小字符串工作正常,但对于较大的字符串(我尝试过:听过,入伍)它给了我一个“不!”
Help !
#include<iostream.h>
#include<string.h>
#include<stdio.h>
int main()
{
char str1[100], str2[100];
gets(str1);
gets(str2);
int i,j;
int n1=strlen(str1);
int n2=strlen(str2);
int c=0;
if(n1!=n2)
{
cout<<"\nThey are not anagrams ! ";
return 0;
}
else
{
for(i=0;i<n1;i++)
for(j=0;j<n2;j++)
if(str1[i]==str2[j])
++c;
}
if(c==n1)
cout<<"yes ! anagram !! ";
else
cout<<"no ! ";
system("pause");
return 0;
}
我很懒,所以我会使用标准库功能对两个字符串进行排序,然后比较它们:
#include <string>
#include <algorithm>
bool is_anagram(std::string s1, std::string s2)
{
std::sort(s1.begin(), s1.end());
std::sort(s2.begin(), s2.end());
return s1 == s2;
}
一个小的优化可能是在排序之前检查字符串的大小是否相同。
但如果这个算法被证明是一个瓶颈,我会暂时摆脱一些懒惰,并将其与简单的计数解决方案进行比较:
- 比较字符串长度
- 实例化一个计数图,
std::unordered_map<char, unsigned int> m
- 循环播放
s1
,增加每个的计数char
.
- 循环播放
s2
,减少每个的计数char
,然后检查计数是否为0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)