zoukankan      html  css  js  c++  java
  • POJ1035Spell checker

    转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1309051410

     

    大致题意:

    输入一部字典,输入若干单词

    1、  若某个单词能在字典中找到,则输出corret

    2、  若某个单词能通过 变换 删除 添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据  输入的那部字典的字典序

    3、  若某个单词无论操作与否都无法在字典中找得到,则输出空

     

    解题思路:

    没难度的字符串处理,1AC

    暴力吧!模拟吧!

     

    基本思路就是逐个比较 待查单词 字典单词 的长度,当且仅当两者长度之差的绝对值<=1时才进行检查操作。

     

    Source修正:

    http://neerc.ifmo.ru/past/1998.html

     

     

      1 //Memory Time 
    2 //456K 157MS
    3
    4 #include<iostream>
    5 #include<string.h>
    6 using namespace std;
    7
    8 char dict[10001][16];
    9 char word[51][16];
    10
    11 int DictNum=0; //字典计数器
    12 int WordNum=0; //单词计数器
    13
    14 void Input(void);
    15 bool Change(char* word,char* dict); //检查字符串word能否通过变换得到dict
    16 bool Del(char* word,char* dict); //检查字符串word能否通过删除得到dict
    17 bool Add(char* word,char* dict); //检查字符串word能否通过添加得到dict
    18
    19 int main(void)
    20 {
    21 Input();
    22
    23 int* DictLen=new int[DictNum]; //记计算字典中各个单词的长度
    24 for(int n=0;n<DictNum;n++)
    25 DictLen[n]=strlen(dict[n]);
    26
    27 for(int i=0;i<WordNum;i++)
    28 {
    29 int* address=new int[DictNum]; //记录word[i]通过变化得到的单词在dict中的下标
    30 int pa=0; //address指针
    31
    32 bool flag=false; //标记字典中是否含有单词word[i]
    33 int len=strlen(word[i]);
    34
    35 for(int k=0;k<DictNum;k++) //遍历字典
    36 {
    37 if(DictLen[k]==len) //Change or Equal
    38 {
    39 if(!strcmp(word[i],dict[k]))
    40 {
    41 flag=true;
    42 break;
    43 }
    44 else if(Change(word[i],dict[k]))
    45 address[pa++]=k;
    46 }
    47 else if(len-DictLen[k]==1) //Delete
    48 {
    49 if(Del(word[i],dict[k]))
    50 address[pa++]=k;
    51 }
    52 else if(DictLen[k]-len==1) //Add
    53 {
    54 if(Add(word[i],dict[k]))
    55 address[pa++]=k;
    56 }
    57 }
    58
    59 /*Output*/
    60
    61 if(flag)
    62 cout<<word[i]<<" is correct"<<endl;
    63 else
    64 {
    65 cout<<word[i]<<": ";
    66 for(int j=0;j<pa;j++)
    67 cout<<dict[ address[j] ]<<' ';
    68 cout<<endl;
    69 }
    70
    71 delete address;
    72 }
    73 return 0;
    74 }
    75
    76 void Input(void)
    77 {
    78 while(cin>>dict[DictNum] && dict[DictNum++][0]!='#');
    79 while(cin>>word[WordNum] && word[WordNum++][0]!='#');
    80
    81 DictNum--; //剔除'#'
    82 WordNum--;
    83 return;
    84 }
    85
    86 bool Change(char* word,char* dict) //WordLen==DictLen
    87 {
    88 int dif=0; //记录word与dict中在相同位置出现不同字符的个数
    89
    90 while(*word)
    91 {
    92 if(*(word++) != *(dict++))
    93 {
    94 dif++;
    95 if(dif>1)
    96 return false;
    97 }
    98 }
    99 return true;
    100 }
    101
    102 bool Del(char* word,char* dict) //WordLen==DictLen+1
    103 {
    104 int dif=0; //记录word与dict中在对应位置出现不同字符的个数
    105
    106 while(*word)
    107 {
    108 if(*word != *dict)
    109 {
    110 word++; //word后移一位再匹配
    111 dif++;
    112 if(dif>1)
    113 return false;
    114 }
    115 else
    116 {
    117 word++;
    118 dict++;
    119 }
    120 }
    121 return true;
    122 }
    123
    124 bool Add(char* word,char* dict) //WordLen==DictLen-1
    125 {
    126 int dif=0; //记录word与dict中在对应位置出现不同字符的个数
    127
    128 while(*dict)
    129 {
    130 if(*word != *dict)
    131 {
    132 dict++; //dict后移一位再匹配
    133 dif++;
    134 if(dif>1)
    135 return false;
    136 }
    137 else
    138 {
    139 word++;
    140 dict++;
    141 }
    142 }
    143 return true;
    144 }
  • 相关阅读:
    第11组 团队Git现场编程实战
    团队项目-需求分析报告
    团队项目-选题报告
    第10组 Alpha事后诸葛亮
    第10组 Alpha冲刺(6/6)
    第10组 Alpha冲刺(5/6)
    第10组 Alpha冲刺(4/6)
    第10组 Alpha冲刺(3/6)
    第10组 Alpha冲刺(2/6)
    第10组 Alpha冲刺(1/6)
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2122172.html
Copyright © 2011-2022 走看看