一,题意:
  给出一组字典的单词,以'#'结束,之后给出一组要执行模糊匹配的单词序列,以'#'结束
  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. 利用set排序数组并且去掉重复的数组元素

    public class testList { public static void main(String[] args){ java.util.List<String> ls = ne ...

  2. tp框架之留言板练习

    登陆控制器与显示页面 <?php namespace Admin\Controller; use Think\Controller; class DengController extends C ...

  3. centos+scala2.11.4+hadoop2.3+spark1.3.1环境搭建

    一.Java安装 1.安装包准备: 首先到官网下载jdk,http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads- ...

  4. racket

    let 和 let* 区别 ``` racket // 这是对的 (let* ([x (random 4)][o (random 4)] [diff (number->string (abs ( ...

  5. 关于P,V操作理解的突破,关于并发设计与并行

    今天又找了一篇博客研究P,V操作.. 发现..它有一个变量没有声明.. 我就换了篇博客..http://c.biancheng.net/cpp/html/2600.html 然后就看懂了.. 关键突破 ...

  6. Material Design兼容包的使用

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

  7. dedecms 文章页图片改为绝对路径

    这几天在网站改版,想把网站做大,想做频道页二级域名,于是在做网站的过程中发现一个问题,dedecms开设二级域名后,在二级域名的文章页无法显示图片,查看源代码后发现问题,由于dedecms文章页中的图 ...

  8. Mac AppleScript 自动完成按键

    本人用AppleScript成功实现了打开锐捷app,并且在用户验证框输入我的用户密码,然后强制退出锐捷.(至于为什么这么做呢?用校园网的痛苦,一言难尽啊!) 学习以下内容,首先你要自行百度资料来学习 ...

  9. JSTL标签库

    JSP页面作为内嵌java的Html简化了Servlet在控制页面显示的语法,但JSP脚本中的表达式功能不够强大,语法也稍显繁杂,EL(Expression Language)表达式语言的出现能够大大 ...

  10. NOIP提高模拟题 完全平方数

    完全平方数 (number.***(c/cpp/pas),1000ms,128mb) [问题描述] 一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(Pefect Sqaure),也称 ...