在一篇英文文章中,输入一个字母,请输出与该字母一起出现频率最高的三个字母。
如:输入s,可能和s一起出现频率最高的就是t,e.....
想知道算法!!!如果可以,可以给个代码作为参考吗?非常谢谢
之前回答过你的问题。
和计算出现频率最高的字母其实类似,只不过那个只需要一个向量保存结果,这个需要一个矩阵,保存字母转移关系。最后统计输出。要代码,请采纳。
我的想法是这样:
建立一个代表字母的数组a[300],比如a[A]表示A出现的次数。
那么当搜索到一个单词的时候,如果出现了你一开始输入的那个字母,只要把这个单词里其他字母的对应a[(char)]++即可。
最后在这里找一下数字最大的三个就行啦!
c语言写的,这个跟c++应该没多少区别吧
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
int count[26] = {0};
char keyword;
char pre_kw;
char ch;
int i;
FILE *fp;
if((fp = fopen("artical.txt", "r")) == NULL)
{
printf("file open faild!\n");
exit(0);
}
scanf("%c", &keyword);
ch = fgetc(fp);
while(feof(fp) == 0)
{
if(ch == keyword)
{
if(isalpha(pre_kw) != 0) count[tolower(pre_kw) - 97]++;
pre_kw = ch;
ch = fgetc(fp);
if(isalpha(ch) != 0) count[tolower(ch) - 97]++;
}
else
{
pre_kw = ch;
ch = fgetc(fp);
}
}
for(i = 0; i< 26; i++)
{
if(i%8 == 0)printf("\n");
printf("%c %d ", i + 97, count[i]);
}
printf("\n");
return 0;
}
@caozhy 请问能帮看一下吗?我知道有很多很明显的错误,请指点!
//第二题第一问
#include
#include
#include
#include
using namespace std;
int ar[27];//26个字母和非字母的个数
int ord[27];//26个字母的其他非字母的频率高低排序
int cmp(const void a, const void *b)//执行减法的操作 ,不保存运算结果
{
return ar[(int )a] - ar[(int *)b];
}
int main()
{
int j;
char ch;
cout<<"请输入您想查询亲密关系的字母:"< cin>>ch;
memset(ar, 0, sizeof(int) * 27);
ifstream in("data1.txt");//打开文件
for (string s; getline(in,s);)
{
const char * pchar = s.c_str();//临时指针 ,内容不可变更
int len = strlen(pchar);
for (int j = 0; j < len; j++)
{
if ( pchar[j] == ch )
{
if(cin.peek()>='a'||cin.peek()>='z') ar[cin.peek() - 'a']++;//如果查询字符为当前字符,那么n的个数加1
if(cin.peek()<='A'||cin.peek()>='Z') ar[cin.peek() - 'A']++;
continue;
}
if ( cin.peek() == ch )
{
if(cin.peek()>='a'||cin.peek()>='z') ar[pchar[j]-'a']++;//如果查询字符为当前字符的下一个字符,那么当前字符的个数加1
if(cin.peek()<='A'||cin.peek()>='Z') ar[pchar[j]-'A']++;
continue;
}
}
}
for (int j = 0; j < 27; j++)
{
ord[j] = j;
};
qsort(ord, 27, sizeof(int), cmp);//频率从小到大排序,在头文件stdlib.h中
for(j = 25;j >= 0;j--)
{
for(i=0;i<26;i++) cout<<(char)(bb[i]+97)<<c[i]<<' ';
}
cout<<endl;
in.close();
return 0;
}