一,题意:
  给出一组字典的单词,以'#'结束,之后给出一组要执行模糊匹配的单词序列,以'#'结束
  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. web socket (记录下来方便观看)

    Web Sockets HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术,使客户端浏览器具备像 C/S 架构下桌面系统的实时通讯能力. 浏览器通过 JavaScript ...

  2. ORA-12541:TNS没有监听器

    cmd---services.msc----以Oracle开头TNListener结尾的服务启动它 如果还没有启动,修改注册表,Win+r,输入regedit回车,找到HKEY_LOCAL_MACHI ...

  3. 【leetcode】Container With Most Water

    题目描述: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...

  4. git 的基本使用

    git 的使用步骤: 1. 新建一个文件夹,然后进入终端, 2. cd <文件夹路径>  ——->进入当前目录: 2.psw    ————>查看当前路径 3.git init ...

  5. nodejs复习03

    文件系统fs 重命名 fs.rename() fs.renameSync 优先选择异步,可以进行异常判断 打开关闭文件 fd = fs.openSync(file, flags) fs.closeSy ...

  6. LINUX 根目录说明

    linux目录:/bin      bin是Binary的缩写.这个目录存放着最经常使用的命令./boot 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件./data / ...

  7. java.lang.IllegalStateException: Web app root system property already set to different value

    webAppRootKey是在java web项目的web.xml配置文件中表示项目的唯一标示,在Eclipse调试Web项目时,项目的路径是一个临时路径,不在真正的路径下,可以通过log4j日志的方 ...

  8. Material Design兼容包的使用

    为了方便自己以后的查找,于是就写了这个博客,废话就不多说,开始干: 导入: compile 'com.android.support:appcompat-v7:24.2.1' compile 'com ...

  9. DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)

    题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...

  10. iOS APP可执行文件的组成

    iOS APP编译后,除了一些资源文件,剩下的就是一个可执行文件,有时候项目大了,引入的库多了,可执行文件很大,想知道这个可执行文件的构成是怎样,里面的内容都是些什么,哪些库占用空间较高,可以用以下方 ...