poj1035 Spell checker

参考 優YoU http://user.qzone.qq.com/289065406/blog/1309051410

字符串通过长度建立一个哈希,在对查找相似单词,巧妙利用长度,操作简单高效,没有传统的改变、增加和删除一个字母,然后重新匹配,而是领用字符串的长度相等和相差一,进行分析,比较不同就行。

题目代码
#include  <iostream>
#include  <cstring>
  using namespace std;

  char dictionary[10010][20];     
  char word[55][20];

  int dictNum=0;
  int wordNum=0;

  bool change(char *dict,char *w);
  bool del(char *dict,char *w);
  bool add(char *dict,char *w);

  int main ()
  {


      while(cin>>dictionary[dictNum]&& strcmp(dictionary[dictNum],"#"))  //字典的输入
      {
          dictNum++;                                                       //字典中单词的个数
      }

      while(cin>>word[wordNum]&& strcmp(word[wordNum],"#"))  //check单词输入
      {
          wordNum++;             //check单词的个数
      }

      int*result=new int [dictNum];     //符合条件单词在字典中,数组的下标
      intpos;

      int*dictLen=new int [dictNum];     //储存字典中每个单词的长度
      intk;
      inti,j;
      intwordLen;
      boolflag;                         //判断字典中是否存在该单词



      for(k=0;k
        dictLen[k]=strlen(dictionary[k]);


      for(i=0;i
      {
          wordLen=strlen(word[i]);
          flag=false;
          pos=0;

          for(j=0;j
            {
                if(wordLen==dictLen[j])        //单词长度相等的情况
                    {
                        if(!strcmp(word[i],dictionary[j]))
                            {
                                flag=true;
                                break;
                            }
                        else
                            {
                                if(change(dictionary[j],word[i]))
                                    {
                                        result[pos]=j;
                                        pos++;
                                    }
                            }
                    }

                if(wordLen==dictLen[j]-1)
                    {
                      if(add(dictionary[j],word[i]))
                          {
                              result[pos]=j;
                              pos++;
                          }
                    }

                if(wordLen==dictLen[j]+1)
                    {
                      if(del(dictionary[j],word[i]))
                          {
                              result[pos]=j;
                              pos++;
                          }
                    }

            }

          if(flag)
              cout<<word[i]<<"is correct"<<endl;
          else
              {
                  cout<<word[i]<<":";
                  for(k=0;k
                    cout<<dictionary[result[k]]<<'';
                    cout<<endl;

              }

      }

        delete dictLen;
      return 0;
  }

  bool change(char *dict,char *w)
  {
      intnum=0;

      while(*w)
      {
          if(*w!=*dict)
            {
                num++;
                if(num>1)
                    return false;
                w++;
                dict++;
            }
            else
            {
                w++;
                dict++;
            }
      }

      returntrue;
  }

  bool del(char *dict,char *w)
  {

      intnum=0;

      while(*w)
          {
              if(*w!=*dict)
                  {
                      num++;
                      if(num>1)
                        returnfalse;
                      w++;
                  }
              else
                {
                    w++;
                    dict++;
                }
          }

      return true;
  }

    bool add(char *dict,char*w)
    {
        int num=0;

        while(*w)
        {
            if(*w!=*dict)
              {
                  num++;
                  dict++;
                  if(num>1)
                    return false;

              }
            else
            {
                w++;
                dict++;
            }
        }

        return true;
    }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值