由于处理字母过于麻烦,所以这里将字母进行十进制转化,利用hashTable来避免麻烦,比如ABC,先将A提取出来,经过运算变成0,然后提取B,经过运算变成0*52+1+26,然后提取C,变成(0*52+1+26)*52+2+26,对于任意的三位字符串,都是唯一的,如果要求其它位数,可以相应的将数组扩大即可。
输入:
10
5
ABC
abc
Abc
BDC
bds
acb
abc
ABc
ABC
abc
abc
ABC
acB
bac
acb
输出:
字符串 abc 出现了 3 次
字符串 ABC 出现了 2 次
字符串 acB 出现了 0 次
字符串 bac 出现了 0 次
字符串 acb 出现了 1 次
最终可运行的代码如下。
#include<stdio.h>
using namespace std;
const int maxn = 100;
char s1[maxn][5];
char s2[maxn][5];
int hashTable[52*53*53] = {0};
int n2[maxn] = {0};
int trans(char s[]){
int num = 0;
for(int i=0;s[i];i++){
if('a'<=s[i]&&s[i]<='z') num = num*52 + (int) s[i]-'a';
else if('A'<=s[i]&&s[i]<='Z') num = num*52 + 26 + (int) s[i]-'A';
}
return num;
}
int main(){
int n, m;
scanf("%d %d",&n,&m);
printf("有 %d 个待查询的字符串,有 %d 个需查询的字符串",n,m);
printf("\n输入待查询的字符串数组:\n");
for(int i=0;i<n;i++){
scanf("%s",&s1[i]);
int num = trans(s1[i]);
hashTable[num]++;
}
printf("输入需查询的字符串数组:\n");
for(int i=0;i<m;i++){
scanf("%s",&s2[i]);
n2[i] = trans(s2[i]);
}
for(int i=0;i<m;i++){
printf("字符串 %s 出现了 %d 次",s2[i],hashTable[n2[i]]);
if(i<m-1) printf("\n");
}
return 0;
}
运行截图: