题目网址:http://poj.org/problem?id=1035

思路:

看到题目第一反应是用LCS ——最长公共子序列 来求解。因为给的字典比较多,最多有1w个,而LCS的算法时间复杂度是O(n*m),n,m分别对应两个字符串的长度。还要乘上字典的个数和所要匹配的单词数,不出意外地。。超时了。

后面就想到了暴力求解,直接枚举所有情况,先判断字符串长度差是否大于1,大于1的话直接进行下一个循环,否则再继续划分。(len对应字典词长度,l对应要查询的词长度)

假设匹配成功,只会有以下三种情况。

1.  len==l ,只可能是完美匹配,或是替换一个字母

2. len-1==l,查询的词要添加一个字母

3. len==l-1,查询的词要删去一个字母

代码:

 #include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
char word[][];
char str[];
int main(){
int cnt=-;
while (gets(word[++cnt])!=NULL && word[cnt][]!='#');
while (gets(str)!=NULL && str[]!='#') {
vector<int>v;
int ok=;
int l=(int)strlen(str);
printf("%s",str);
for (int i=; i<cnt; i++) {
int len=(int)strlen(word[i]);
int cur=,j=,k=;
if(fabs(len-l)>) continue;
if(len-l==){//情况1
while (str[j] && word[i][j] && cur<=) {
if (str[j]!=word[i][j]) cur++;
j++;
}
if(cur==){
ok=;
printf(" is correct\n");
break;
}
}else if(len-l==){//情况2
while (str[k] && word[i][j]) {
if(str[k]!=word[i][j]){
cur++,j++;
continue;
}
j++;k++;
}
}else if(l-len==){//情况3
while (str[k] && word[i][j]) {
if(str[k]!=word[i][j]){
cur++,k++;
continue;
}
j++;k++;
}
}
if(cur<=) v.push_back(i); }
if(!ok){
printf(":");
for (int j=; j<v.size(); j++) {
printf(" ");
printf("%s",word[v[j]]);
}
printf("\n");
}
}
return ;
}

另附上用LCS做的超时版本。。有用LCS过的 欢迎讨论

 #include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
char word[][];
char str[];
int main(){
int cnt=-;
while (gets(word[++cnt])!=NULL && word[cnt][]!='#');
while (gets(str)!=NULL && str[]!='#') {
vector<int>v;
int ok=;
int l=(int)strlen(str);
printf("%s",str);
for (int i=; i<cnt; i++) {
int lcs[][];
int Max=;
int len=(int)strlen(word[i]);
if(fabs(len-l)>) continue;
memset(lcs, , sizeof(lcs));
for (int j=; j<len; j++) {
for (int k=; k<l; k++) {
if(word[i][j]==str[k]) lcs[j+][k+]=lcs[j][k]+;
else lcs[j+][k+]=max(lcs[j+][k], lcs[j][k+]);
Max=max(Max, lcs[j+][k+]);
}
}
if(max(len,l)==Max){//完全匹配
ok=;
printf(" is correct\n");
break;
}else if(max(len,l)==Max+){//增删改其中的一个情况
if(len==Max || l==Max){//增删情况
v.push_back(i);
}else{
int j=;
int cur=;
while (word[i][j] && str[j]) {
if(word[i][j]==str[j]) cur++;
j++;
}
if(cur==Max){//修改一个的情况
v.push_back(i);
}
}
}
}
if(!ok){
printf(":");
for (int j=; j<v.size(); j++) {
printf(" ");
printf("%s",word[v[j]]);
}
printf("\n");
}
}
return ;
}

POJ 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 字符串 难度:0

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

  5. poj 1035 Spell checker(水题)

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

  6. poj 1035 Spell checker(hash)

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

  7. POJ 1035 Spell checker (模拟)

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

  8. POJ 1035 Spell checker 简单字符串匹配

    在输入的单词中删除或替换或插入一个字符,看是否在字典中.直接暴力,172ms.. #include <stdio.h> #include <string.h> ]; ][], ...

  9. POJ训练计划1035_Spell checker(串处理/暴力)

    Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18418   Accepted: 6759 De ...

随机推荐

  1. 数据库高级:SQL-CREATE-TABLE语句

    作者:松软科技(www.sysoft.net.cn) 发布时间:2019/3/17 9:34:51 CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CRE ...

  2. 自定义JDBC工具类

    因为数据库的连接代码都是固定的,为了将减少重复的代码的书写,可以将这些代码封装为一个工具类,获取数据库的连接对象. import java.sql.Connection; import java.sq ...

  3. 【PTA】浙江大学数据结构慕课 课后编程作业 03-树1 树的同构

    题目内容 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右 ...

  4. 37 (OC)* 类别的作用

    问题: OC中类别(Category)是什么?Category类别是Objective-C语言中提供的一个灵活的类扩展机制.类别用于在不获悉.不改变原来代码的情况下往一个已经存在的类中添加新的方法,只 ...

  5. asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 连接数据库

    在.netstandard2.0时 System.Data.Common 这个包里并没有加入DbProviderFactories DbProviderFactories类在.netframework ...

  6. event.stopPropagation()、event.preventDefault()与return false的区别

    做小demo时经常用到return false来取消默认事件,但一直不是很懂它和preventDefault()等的区别,今天查了查文档和大神们的博客,在这里对相关知识点做一个总结 首先开门见山,总结 ...

  7. Jmeter BeanShell 执行多次问题,每发送一次请求执行一次BeanShell问题

    前言:(此问题耗时半天) 提供解决思路的博主又有新问题了. 如图所示,写了一个BeanShell从文件中去获取值之后给测试计划的变量赋值. 问题来了,当禁用b的情况下,a只执行一次.当启用b请求的情况 ...

  8. Cisco交换机、路由器,密码恢复

    一.路由器密码恢复 1.重启路由器,同时按下ctrl + breack键中断IOS的加载,路由器进入ROM Monitor模式 2.将配置寄存器的值更改为 0x2142,表示在启动时忽略startup ...

  9. java 对数组进行截取组合操作

    1.使用skip跳过和limit限制组合,示例: Integer skip = (page.getPageNum() - 1) * page.getPageNum(); Integer limit = ...

  10. 03-css的继承性和层叠性

    一.继承性 css中所谓的继承,就是子集继承父级的属性. 可以继承的属性:color.font-xxx.text-xxx.line-xxx.(主要是文本级的标签元素) 但是,像一些盒子元素属性,定位的 ...