一,题意:
  给出一组字典的单词,以'#'结束,之后给出一组要执行模糊匹配的单词序列,以'#'结束
  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. linux常用命令备忘

    scp使用非默认端口 scp -P port username@.....IP:/dir 要拷贝到的地方

  2. Lintcode 75.寻找峰值

    --------------------------------------- 按照给定的峰值定义,峰值的左半部分一定是递增的,所以只要找到不递增的即可. AC代码: class Solution { ...

  3. javaScript事件(一)事件流

    一.事件 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字.事件是javaScript和DOM之间的桥梁.你若触发,我便执行——事件发生,调用它的处理函数 ...

  4. EXT.JS的PROXY放在哪里,STORE放在哪里,绝对是个技术活儿啊。

    我理解的是,单独的STORE,会在应用程序开始时就加载, 而VIEWMODEL的STORE,会在VIEW加载时才开始加载. PROXY放在STORE,则会在调用这个STORE的VIEW才能请求服务器数 ...

  5. rman恢复报ORA-27039

    查看资源限制: AIX修改参数文件/etc/security/limits 如下: 重新su到用户下即可生效

  6. Windows - 性能监控之磁盘剩余空间大小警报

    开始 -> 运行 -> 键入命令 perfmon.msc 数据收集器(Data Collector Sets) -> 用户自定义(User Defined)

  7. orm映射 封装baseDao

    是用orm映射封装自己封装dao层 思路:通过映射获得实体类的属性拼接sql语句 import java.lang.reflect.Field; import java.lang.reflect.In ...

  8. C++Primer学习笔记(1)

    序: 为了重新扎扎实实地再深入学习一遍C++,我选择了C++ Primer这本经典.又开了这个系列的随笔,用于记录学习过程中遇到的一些有趣的问题和心得.同时,也是想通过写随笔的方式督促自己不断进步,争 ...

  9. 【转】Oracle索引的类型

    数据库的应用类型分为 OLTP(OnLine Transaction Processing ,联机事务处理):OLTP是传统关系型数据库的主要应用,其主要面向基本的.日常的事务处理,例如银行交易. O ...

  10. js排序算法总结—冒泡,快速,选择,插入,希尔,归并

    相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...