Spell checker--POJ 1035
2010-07-19 20:15
435 查看
1、题目类型:字符串、暴力法、trie树。
2、解题思路:(1)记录字符串字典;(2)每输入一个字符串,查找字典中是否存在;(3)如果不存在,依次寻找其是否可以通过字典中字符串替换、添加、删除单个字符获得。
3、注意事项:string.h库函数的使用:trie树的指针的判断,TNode结构体的设计。
4、实现方法:(暴力法)
5、实现方法:(trie树)
2、解题思路:(1)记录字符串字典;(2)每输入一个字符串,查找字典中是否存在;(3)如果不存在,依次寻找其是否可以通过字典中字符串替换、添加、删除单个字符获得。
3、注意事项:string.h库函数的使用:trie树的指针的判断,TNode结构体的设计。
4、实现方法:(暴力法)
#include <iostream> #include <string> #include <vector> using namespace std; int ok; int ldic, lstr; string current; vector<string> dic; void Init() { /* 读数据 */ while(1) { cin >> current; if (current == "#") break; dic.push_back(current); } } /* 替换一个字符 */ void replace(string dic) { int count = 0; /* 只有一个字符不一样就OK */ for (int i = 0; i < dic.length(); i++) { if (current[i] != dic[i]) count++; if (count > 1) return; } ok = 1; cout << " " + dic; } /* 增加一个字符 */ void insert(string dic) { string tmp; for (int i = 0; i < current.length(); i++) { /* 在不同位置增加字符 */ if (current[i] != dic[i]) { tmp = dic; tmp.insert(i, 1, current[i]); if (tmp == current) { ok = 1; cout << " " + dic; } return; } } } /* 删除一个字符 */ void del(string dic) { string tmp; for (int i = 0; i < dic.length(); i++) { /* 删除不同位置的字符 */ if (current[i] != dic[i]) { tmp = dic; tmp.erase(i, 1); if (tmp == current) { ok = 1; cout << " " + dic; } return; } } } void Seach() { ok = -1; lstr = current.length(); /* 判断是否correct */ for (int i = 0; i < dic.size(); i++) { if (dic[i] == current) { cout << current + " is correct"; ok = 0; break; } } /* 处理 */ if (ok < 0) { cout << current + ':'; for (int i = 0; i < dic.size(); i++) { ldic = dic[i].length(); if (lstr == ldic) { replace(dic[i]); } else if (lstr == ldic + 1) { insert(dic[i]); } else if (lstr == ldic - 1) { del(dic[i]); } } } } int main() { Init(); while(1) { cin >> current; if (current == "#") break; Seach(); cout << endl; } return 0; }
5、实现方法:(trie树)
#include <iostream> using namespace std; char word[10001][27],res[10001][27]; int n,m,len,cnt; bool flag; struct TNode { int index,len; TNode *p[26]; TNode() { index = -1; len = 0; for(int i = 0 ; i < 26; i++) p[i] = NULL; } }root; void Create(char *str) { int len1 = strlen(str); TNode *ptr = &root; for(int i = 0 ; i < len1; i++) { if(ptr->p[str[i]-'a'] == NULL) ptr->p[str[i]-'a'] = new TNode(); ptr = ptr->p[str[i]-'a']; } ptr->index = cnt++; ptr->len = len1; } int search(char *str) { int len1 = strlen(str); TNode *ptr = &root; for(int i = 0 ; i < len1; i++) { if(ptr->p[str[i]-'a'] == NULL) return -1; ptr = ptr->p[str[i]-'a']; } if(ptr->len == len1) return ptr->index; else return -1; } void ADD(char *str) { int pos,len1=strlen(str),i,k; char z,temp[30]; for(i=0;i<=len1;i++) { for(z='a';z<='z';z++) { for(k=0;k<i;k++) temp[k]=str[k]; temp[i]=z; for(k=i+1;k<=len1;k++) temp[k]=str[k-1]; temp[len1+1]='\0'; pos=search(temp); if(pos == -1) continue; strcpy(res[pos],temp); flag = 1; } } } void Delete(char *str) { char temp[30]; int pos,i,j,k,len1=strlen(str); for(i=0;i<len1;i++) { k=0; for(j=0;j<len1;j++) { if(j==i) continue; temp[k++]=str[j]; } temp[k]='\0'; pos=search(temp); if(pos == -1) continue; strcpy(res[pos],temp); flag = 1; } } void Change(char *str) { int len1=strlen(str),i,j,pos; char z, temp[30]; for(j=0;j<len1;j++) temp[j]=str[j]; temp[len1]='\0'; for(i=0;i<len1;i++) { for(z='a';z<='z';z++) { if(z==str[i]) continue; temp[i]=z; pos=search(temp); if(pos == -1) continue; strcpy(res[pos],temp); flag = 1; } temp[i] = str[i]; } } int main() { int i; for(i = 0 ; ; i++) { scanf("%s",word[i]); if(word[i][0] == '#') break; Create(word[i]); } n = i; char query[30]; for(i = 0 ; ; i++) { flag = false; scanf("%s",query); memset(res,0,sizeof(res)); if(query[0] == '#') break; int kk = search(query); if(kk != -1) { cout<<query<<" is correct"<<endl; continue; } ADD(query); Delete(query); Change(query); if(flag) { cout<<query<<":"; for(int k = 0 ; k < 10001 ;k++) if(res[k][0] != 0) cout<<" "<<res[k]; cout<<endl; } else cout<<query<<":"<<endl; } return 0; }
相关文章推荐
- poj 1035 Spell checker
- poj 1035 (Spell checker )
- Spell checker poj 1035 (串的练习)
- POJ1035-Spell checker
- poj 1035 Spell checker 字符串,暴力
- poj 1035 Spell checker(水题)
- POJ 1035 Spell checker 简单字符串匹配
- POJ 1035 Spell checker (字符串模拟)
- POJ 1035 Spell checker(字符串简单匹配)
- [POJ1035 Spell checker]
- POJ 1035 Spell checker(string)应用
- poj 1035 Spell checker(暴力判断)
- poj 1035 Spell checker【字符串】
- POJ 1035 Spell checker【字符串处理】
- Spell checker poj 1035
- POJ 1035 Spell checker(字符串处理)
- Spell checker POJ 1035 字符串
- POJ1035——Spell checker(字符串操作)
- poj 1035 Spell checker(字符串)
- Spell checker poj1035