您的位置:首页 > 其它

Spell checker--POJ 1035

2010-07-19 20:15 435 查看
1、题目类型:字符串、暴力法、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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: