再次帮我改进check函数。题目要求:单词检查是根据字典,找出输入文本中拼错的单词,我们认为凡是不出现在字典中的单词都是错误单词。不仅如此,一些检查程序还能给出类似拼错单词的修改建议单词。 例如字典由下面几个单词组成: bake cake main rain vase 如果输入文件中有词vake ,检查程序就能发现其是一个错误的单词,并且给出 bake, cake或vase做为修改建议单词。 修改建议单词可以采用如下生成技术: (1)在每一个可能位置插入‘a-'z'中的一者 (2)删除单词中的一个字符 (3)用‘a'-'z'中的一者取代单词中的任一字符 很明显拼写检查程序的核心操作是在字典中查找某个单词,如果字典很大,性能无疑是非常关键的。 你写的程序要求读入字典文件,然后对一个输入文件的单词进行检查,列出其中的错误单词并给出修改建议。 本题要求使用使用二叉排序树维护字典
时间: 2024-04-02 12:32:53 浏览: 34
php-lang-correct:由于键盘布局不正确而对文本中的单词进行自动语言校正
根据您的要求,我对check函数进行了改进,实现了单词的检查和修改建议。改进后的代码如下:
void check(BSTree &T,string e) {
if(!T)
{
cout<<e<<" ";
suggest(T,e);
return;
}
string s=T->word;
if(Search(T,e))
return;
if(e.length()<s.length())
check(T->lchild,e);
else if(e.length()>s.length())
check(T->rchild,e);
else
{
int count=0,i=0;
while(i<s.length() && count<2)
{
if(s[i]!=e[i])
count++;
i++;
}
if(count<2)
suggest(T,s);
else
{
check(T->lchild,e);
check(T->rchild,e);
}
}
}
void suggest(BSTree &T,string s) {
cout<<"Suggestion: ";
insert(T,s);
deleteChar(T,s);
replaceChar(T,s);
}
void insert(BSTree &T,string s) {
for(int i=0;i<=s.length();i++)
{
for(char c='a';c<='z';c++)
{
string tmp=s.substr(0,i)+c+s.substr(i);
if(Search(T,tmp))
cout<<tmp<<" ";
}
}
}
void deleteChar(BSTree &T,string s) {
for(int i=0;i<s.length();i++)
{
string tmp=s.substr(0,i)+s.substr(i+1);
if(Search(T,tmp))
cout<<tmp<<" ";
}
}
void replaceChar(BSTree &T,string s) {
for(int i=0;i<s.length();i++)
{
for(char c='a';c<='z';c++)
{
if(s[i]!=c)
{
string tmp=s;
tmp[i]=c;
if(Search(T,tmp))
cout<<tmp<<" ";
}
}
}
}
其中,suggest函数实现了给出修改建议的操作,insert函数实现了在每一个可能位置插入一个字符的操作,deleteChar函数实现了删除单词中的一个字符的操作,replaceChar函数实现了用一个字符取代单词中的任一字符的操作。这些操作都是基于搜索树上的操作实现的,因此可以快速找到可能的修改建议。
阅读全文