本文出自:http://blog.csdn.net/svitter
一开始,输入字典中的字符,以#结束。
随后,输入查询的字符,以#结束。
其中,符合要求的查询项目有:
1.去除一个字符,可以匹配
2.取代一个字符,可以匹配
3.添加一个字符,可以匹配
1.注意不要将#包含进入字典。
2.对于每一个字符进行分析。
使用哈希表或者直接暴力解题。
一个字符指针指向要查询的单词,一个字典指针指向字典中的单词。
分为三种处理情况:
1.对于去除一个字符的情况,可以移动一次字符指针,字符长度为字典长度+1
2.对于取代一个字符情况,同时移动两个指针一次,字符长度=字典长度
3.对于添加一个字符的情况,移动一次字典指针,字符长度+1=字典长度
//author: svtter
//
#include <cmath>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <map>
#define INF 0xffffff
using namespace std;
char dict[10010][16];
char temp[16];
bool del(char *word, char *dic);
bool rep(char *word, char *dic);
bool add(char *word, char *dic);
int main()
{
int i;
int nDict;
char *word, *dic;
bool operation;
bool get = false;
for(i = 0; i < 10002; i++)
{
scanf("%s", dict[i]);
if(dict[i][0] == '#')
{
nDict = i;
break;
}
}
//Do something
//printf("now input words: \n");
while(scanf("%s", temp))
{
if(temp[0] == '#')//stop condition
break;
word = temp;
get = false;
for(i = 0; i < nDict; i++)
{
dic = dict[i];
if(strcmp(word, dic) == 0)
{
printf("%s is correct\n", word);
get = 1;
break;
}
}
if(!get)
{
printf("%s:", word);
for(i = 0; i < nDict; i ++)//del operation
{
dic = dict[i];
operation = del(word, dic);
if(operation)
{
printf(" %s", dic);
get = 1;
}
operation = rep(word, dic);
if(operation)
{
printf(" %s", dic);
get = 1;
}
operation = add(word, dic);
if(operation)
{
printf(" %s", dic);
get = 1;
}
}
printf("\n");
}
}
return 0;
}
bool del(char *word, char *dic)
{
int dis = strlen(word) - strlen(dic);
if(dis != 1)
return false;
int diff = 0;
while(*word)
{
if(*word != *dic)
{
word++;
diff++;
if(diff > 1)
return false;
}
else
{
word++;
dic++;
}
}
return true;
}
bool rep(char *word, char *dic)
{
int dis = strlen(word) - strlen(dic);
if(dis != 0)
return false;
int diff = 0;
while(*word)
{
if(*word != *dic)
{
word++;
dic++;
diff++;
if(diff > 1)
return false;
}
else
{
word++;
dic++;
}
}
return true;
}
bool add(char *word, char *dic)
{
int dis = strlen(word) - strlen(dic);
if(dis != -1)
return false;
int diff = 0;
while(*word)
{
if(*word != *dic)
{
dic++;
diff++;
if(diff > 1)
return false;
}
else
{
dic++;
word++;
}
}
return true;
}
/*
题意:输入字典,然后输入单词,判断字典中是否出现过该单词,或者是否进行删除、添加、替换操作,如果是,则输出对应的字典中的单词
要求按照输入时候的排名输出
题解:建立两个哈希表。一个存储字典和输入字典中单词的排名,一个进行最后输出的判重
*/
#include <iostream>
#include <string.h>
#include <cstdio>
#include <algorithm>
//#define
using namespace std;
const int HASH = 12007;
char list1[HASH][18];
int rank[HASH];
int head1[HASH];
char list2[HASH][18];
int head2[HASH];
int ans[10007];
int ansLen;
char word[57];
char tempWord[57];
int insert1(char *s, int pos)
{
int len = strlen(s);
int i, k = 0;
for(i = 0; i < len; ++ i)
k = (k * 26 + s[i] - 'a') % HASH;
while(head1[k] != 0 && strcmp(list1[k], s) != 0)
{
k = (k + 1) % HASH;
}
if(!head1[k])
{
head1[k] = 1;
strcpy(list1[k], s);
rank[k] = pos;
return 1;
}
return 0;
}
int insert2(char *s)
{
int len = strlen(s);
int i, k = 0;
for(i = 0; i < len; ++ i)
k = (k * 26 + s[i] - 'a') % HASH;
while(head2[k] != 0 && strcmp(list2[k], s) != 0)
{
k = (k + 1) % HASH;
}
if(!head2[k])
{
head2[k] = 1;
strcpy(list2[k], s);
return 1;
}
return 0;
}
int exist(char *s)
{
int len = strlen(s);
int i, k = 0;
for(i = 0; i < len; ++ i)
k = (k * 26 + s[i] - 'a') % HASH;
while(head1[k] != 0 && strcmp(list1[k], s) != 0)
{
k = (k + 1) % HASH;
}
if(!head1[k])
{
return -1;
}
return k;
}
int cmp(const void *a, const void *b)
{
int *pa = (int *) a;
int *pb = (int *) b;
return rank[*pa] - rank[*pb];
}
int main()
{
//int flag = 0;
//freopen("e://data.in", "r", stdin);
while(gets(word))
{
memset(head1, 0, sizeof(head1));
int pos = 0;
while(word[0] != '#')
{
insert1(word, pos ++);
gets(word);
}
gets(word);
while(word[0] != '#')
{
memset(head2, 0, sizeof(head2));
ansLen = 0;
printf("%s", word);
if(exist(word) > -1)
{
printf(" is correct\n");
gets(word);
continue;
}
int len = strlen(word);
int i, k;
char j;
int z;
for(i = 0; i <= len; ++ i)
{
strcpy(tempWord, word);
for(k = len; k >= i; k --)
tempWord[k + 1] = tempWord[k];
for(j = 'a'; j <= 'z'; ++ j)
{
tempWord[i] = j;
if((z = exist(tempWord)) > -1 && insert2(tempWord))
{
ans[ansLen ++] = z;
}
}
}
for(i = 0; i < len; ++ i)
{
strcpy(tempWord, word);
for(k = i + 1; k <= len; ++ k)
tempWord[k - 1] = tempWord[k];
if((z = exist(tempWord)) > -1 && insert2(tempWord))
{
ans[ansLen ++] = z;
}
}
for(i = 0; i < len; ++ i)
{
strcpy(tempWord, word);
for(j = 'a'; j <= 'z'; ++ j)
{
tempWord[i] = j;
#ifdef TEST
if(j == 'd')
{
printf("\n");
}
#endif
if((z = exist(tempWord)) > -1 && insert2(tempWord))
{
ans[ansLen ++] = z;
}
}
}
qsort(ans, ansLen, sizeof(ans[0]), cmp);
printf(":");
for(i = 0; i < ansLen; ++ i)
printf(" %s", list1[ans[i]]);
printf("\n");
gets(word);
}
}
return 0;
}
POJ1035 Spell-checker(哈希,串处理),布布扣,bubuko.com
原文:http://blog.csdn.net/svitter/article/details/38265611