一,题意:
  给出一组字典的单词,以'#'结束,之后给出一组要执行模糊匹配的单词序列,以'#'结束
  1,若某个单词能在字典中找到,则输出corret
  2,若某个单词能通过 变换 或 删除 或 添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据输入的那部字典的字典序
  3,若某个单词无论操作与否都无法在字典中找得到,则输出空
二,思路:
  暴力模拟。
  1,输入,以'#'结束
  2,判断字典的单词和被匹配的单词的长度
    i,如果word的长度等于dict的长度,则可能两个字符串匹配,也可能通过修改其中一个字符之后相匹配。
    ii,否则如果word的长度比dict的长度大 1 ,则判断通过删除一个字符后是否相匹配。
    iii,否则如果dict的长度等于word的长度大 1 ,则判断通过添加一个字符后是否相匹配。
  3,输出。
三,步骤:
  1,输入。
  2,判断:
    i,if strlen(word[])==strlen(dict[])
       if !strcmp(word[i], dict[j]) , 输出corret.
       else if 它们之间不同的字符个数 <= 1 , 则把单词的数组下标存入ans[]
    ii,else if strlen(word[])- strlen(dict[]) == 1
       if 它们之间不同的字符个数 <= 1 , 则 把单词的数组下标存入ans[]
    iii,else if strlen(dict[]) - strlen(word[] == 1
       if 它们之间不同的字符个数 <= 1 , 则 把单词的数组下标存入ans[]
3,输出。

 #include<iostream>
#include<cstring>
using namespace std; char dict[][]; //存储字典
char word[][]; //存储要匹配的单词
int dictNum = ; //字典中单词的个数
int wordNum = ; //要被匹配的单词的个数
int dictLen[]; //存储每个单词的长度
int ans[]; //存储每个单词在字典中的位置 //变换一个字符是否相同
bool change(char word[], char dict[]) {
int count = ;
for (int i = ; i < strlen(word); i++) {
if (word[i] != dict[i]) {
count++;
if (count > ) { //不同的字母不超过1个
return false;
}
}
}
return true;
} //删除一个字符是否相同
bool del(char word[], char dict[]) {
int count = ;
for (int i = , j = ; i < strlen(word); i++) { //word的长度>dict的长度
if (word[i] != dict[j]) { //如果不等于,word[]向后移一位
count++;
if (count > ) {
return false;
}
}
else { //否则word[],dict[]都往后移一位
j++;
}
}
return true;
} //添加一个字符是否相同
bool add(char word[], char dict[]) {
int count = ;
for (int i = , j = ; i < strlen(dict); j++) { //dict的长度>word的长度
if (word[i] != dict[j]) { //如果不等于,dict[]向后移一位
count++;
if (count > ) {
return false;
}
}
else { //否则word[],dict[]都往后移一位
i++;
}
}
return true;
} //主要工作
void work(char dict[][], char word[][]) {
for (int i = ; i < dictNum; i++) {
dictLen[i] = strlen(dict[i]);
}
for (int i = ; i < wordNum; i++) {
memset(ans, , sizeof(ans));
int len = strlen(word[i]);
bool flag = false; //标记区分是第几种情况
int k = ;
for (int j = ; j < dictNum; j++) {
if (dictLen[j] == len) { //Change or Equal
if (!strcmp(word[i], dict[j])) {
flag = true; //若满足第一种情况,则为真
break;
}
else if (change(word[i], dict[j])) {
ans[k++] = j; //如果相同ans[]存储单词在字典中的位置
}
}
else if (len - dictLen[j] == ) { //Delete
if (del(word[i], dict[j])) {
ans[k++] = j;
}
}
else if (dictLen[j] - len == ) { //Add
if (add(word[i], dict[j])) {
ans[k++] = j;
}
}
}
if (flag) {
cout << word[i] << " is correct" << endl;
}
else {
cout << word[i] << ": ";
for (int j = ; j < k; j++) {
cout << dict[ans[j]] << ' ';
}
cout << endl;
}
}
} int main() {
//输入,以'#'结束
while (cin >> dict[dictNum] && dict[dictNum++][] != '#');
while (cin >> word[wordNum] && word[wordNum++][] != '#');
dictNum--; //存储时,不存'#'
wordNum--;
work(dict, word);
return ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

1035-Spell checker(模糊匹配)的更多相关文章

  1. poj 1035 Spell checker

    Spell checker Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u   J ...

  2. poj 1035 Spell checker ( 字符串处理 )

    Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16675   Accepted: 6087 De ...

  3. [ACM] POJ 1035 Spell checker (单词查找,删除替换添加不论什么一个字母)

    Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18693   Accepted: 6844 De ...

  4. POJ 1035 Spell checker (模拟)

    题目链接 Description You, as a member of a development team for a new spell checking program, are to wri ...

  5. POJ 1035 Spell checker 字符串 难度:0

    题目 http://poj.org/problem?id=1035 题意 字典匹配,单词表共有1e4个单词,单词长度小于15,需要对最多50个单词进行匹配.在匹配时,如果直接匹配可以找到待匹配串,则直 ...

  6. POJ 1035 Spell checker(串)

    题目网址:http://poj.org/problem?id=1035 思路: 看到题目第一反应是用LCS ——最长公共子序列 来求解.因为给的字典比较多,最多有1w个,而LCS的算法时间复杂度是O( ...

  7. poj 1035 Spell checker(水题)

    题目:http://poj.org/problem?id=1035 还是暴搜 #include <iostream> #include<cstdio> #include< ...

  8. poj 1035 Spell checker(hash)

    题目链接:http://poj.org/problem?id=1035 思路分析: 1.使用哈希表存储字典 2.对待查找的word在字典中查找,查找成功输出查找成功信息 3.若查找不成功,对word增 ...

  9. PKU 1035 Spell checker(Vector+String应用)

    题目大意:原题链接 1输入一个字符串,如果字典中存在该字符串,直接输出,否则; 2.删除,替换,或插入一个字母.如果使得输入字符串==字典中已经有的单词,输出该单词,否则. 3.直接输入下一个字符串, ...

随机推荐

  1. 51nod1134(最长递增子序列)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134 题意: 中文题诶~ 思路: 直接暴力的话时间复杂度为 ...

  2. 利用C# Winform做Windows系统任务栏

    最近公司做一个考试系统,需要一个答题栏,要求:占用屏幕上方一部分区域,而且始终置顶,当其他窗口最大化时"答题栏"始终置前并且不遮挡最大化窗口的任何部分!就像windows任务栏一样 ...

  3. mysql salve从库设置read only 属性

    在MySQL数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和Master-slave的设置和关系.     经过实际测试,对于MySQL单实例数据库和master库,如果需要设置为只 ...

  4. Beginning Scala study note(8) Scala Type System

    1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the h ...

  5. react native 中webview内的点击事件传到外部原生调用

    先说一下我使用webview的时候遇到的一个功能需求 是这样的,上图中的这个页面是用h5做的,但是由于点击"我的优惠劵"是需要跳转到我原生的页面,也就是说我需要获得这个h5提供的点 ...

  6. Objective-C 源码初探 __attribute__

    #import <Foundation/Foundation.h> //延迟执行,delayFunc函数即为延迟执行的函数 #define onExit\ __strong void (^ ...

  7. md语法

    标题 标题 标题是每篇文章都需要也是最常用的格式,在 Markdown 中,如果一段文字被定义为标题,只要在这段文字前加 # 号即可. # 一级标题 ## 二级标题 ### 三级标题 以此类推,总共六 ...

  8. 【oracle】数据泵expdp与impdp

    1.创建directory create directory dump_dir as 'D:\dump_dir' 2.expdp备份schema expdp system/1qaz2wsx@ETCNC ...

  9. 工厂模式(Factory)

    一.分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式主要分为三个,简单工厂模式(Simple Factory)/ 工厂方法模式(Fac ...

  10. bzoj1927最小费用最大流

    其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→   =_=你TM逗我 刚要删突然感觉dinic的模 ...