问题分析
输入:一个任意的单词和一个内含多个乱序单词的字典文件
输出:该单词在字典中的所有同位词
约束:无
解决思路
一一比对输入单词和字典中各个单词的标识符,如果相同则输出字典中的单词。标识符为一个内含26个整型元素数组,数组中的各个元素表示其对应的字母在其对应单词中出现的次数。比如 aabc 的标识符就是{ 2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }。
代码实现
1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 5 using namespace std; 6 7 #define MAX 26 8 9 /* 10 * 获取单词word的标识符并存入参数数组 11 */ 12 void getID(string word, int array[]) 13 { 14 for (int i=0; i<MAX; i++) { 15 array[i] = 0; 16 } 17 for (string::size_type i=0; i<word.length(); i++) { 18 array[word[i]-97]++; 19 } 20 } 21 22 /* 23 * 比较单词的标识符 24 */ 25 int compareID(int a[], int b[]) 26 { 27 for (int i=0; i<MAX; i++) { 28 if (a[i] != b[i]) 29 return 0; 30 } 31 32 return 1; 33 } 34 35 int main() 36 { 37 /* 38 * a存放查询单词的标识符,b存放其比对对象单词的标识符 39 */ 40 int a[MAX]; 41 int b[MAX]; 42 43 /* 44 * 打开字典文件 45 */ 46 string filename; 47 cout << "请输入字典文件名( 当前目录下 ): "; 48 cin >> filename; 49 50 fstream io; 51 io.open(filename.c_str()); 52 if (!io) { 53 cout << "打开文件失败" << endl; 54 return 1; 55 } 56 57 /* 58 * 获取查询单词及其标识符 59 */ 60 string word; 61 cout << "请输入查询单词: "; 62 cin >> word; 63 getID(word, a); 64 65 /* 66 * 遍历字典文件并打印输入单词的所有同位词 67 */ 68 string tem; 69 cout << "单词 "" << word << "" 的同位词如下:" << endl; 70 while (io >> tem) { 71 getID(tem, b); 72 if ( compareID(a, b) ){ 73 cout << tem << " "; 74 } 75 } 76 cout << endl; 77 78 // 关闭文件指针 79 io.close(); 80 81 return 0; 82 }
运行测试
测试所用字典文件:
运行结果: