POJ 1035 Spell checker 如何写代码的思考

来源:互联网 发布:win7桌面整理软件 编辑:程序博客网 时间:2024/06/05 09:56

给自己的提醒,提交时要将 freopen 注释掉,不然会产生 runtime error

解法:

暴力。时间限制是 2 秒,结合数据范围,暗示我们可以用暴力解决。

将每一个要查询的单词与字典中的单词逐个比对,两重循环。

给出三个条件的等价描述:

deleting of one letter from the word 和 inserting of one arbitrary letter into the word,这两个条件本质上是一样的,将两条件并称为条件1。

符合条件1的两个串,长度一定不相等,这是一个特征,我们设置较长的串为 A ,较短的串为 B。进一步分析,B 一定可以分为两段,一段中所有的字母都和  A 中对应位置的字母相同。另一段将下标加1后,和 A 中对应位置的字母相同。B 中的两段长度加起来,等于 A 的长度减1。

replacing of one letter in the word with an arbitrary letter,符合这个条件的两串长度相同,对应位置的字母只有一处不同。


说下自己的感想:

感觉题目不难,但自己花了很长时间,反思的结果是自己分析问题的思路有问题。姑且算是一种想法。

一份代码大致分为四个模块:输入,数据存储,运算,输出。每一个模块都要接收信息,处理信息,输出信息,各个模块之间有信息传递,可以通过标记变量,数组等等,这是大致框架。

要把握数据的特征。比如字符串的特征:长度,每个标号对应的字母。从这两个特征入手,发现和我们的算法是可以对接上的。

很怕写成那种走歪路,自己看着很对实际错误的东西,这种思路以后带入实践检验吧。

#include <cstdio>#include <cstring>using namespace std;char dic[10005][30], file[55][30], t[30];//t 用于输入char *ans[10005];//存储结果int dic_size[10005];//记录 dic 中每个单词的长度int com(char *l_str, char *s_str, int max_len, bool same_len) {int ps = 0, num = 0;//比较时将两个串当作一样长, 没有字母的地方是\0。 对应位置若不相同, 则假定两串相似, 较短串不移动比较位置。 若两串长度相同, 则比较位置始终都要移动。for (int k = 0;k < max_len;++k) {//l_str 指向较长的串if (l_str[k] != s_str[ps]) {//s_str 指向较短的串++num;//max_len 较长串的长度if (same_len)//same_len 两串是否一样长++ps;}else++ps;}return num;//返回给 dif_num}int main() {//freopen("input.txt", "r", stdin);//scanf 可以用 freopen//runtime error 提交时勿忘注释int n_d = 0;while (scanf("%s", t) && t[0] != '#') {//输入字典strcpy(dic[n_d], t);dic_size[n_d] = strlen(dic[n_d]);++n_d;//勿忘递增}int n_f = 0;while (scanf("%s", t) && t[0] != '#')//输入 filestrcpy(file[n_f++], t);int dif_num, dif_size, dsize, fsize, flag;//dif_num 的意义见 com 函数//dif_size 两个串的长度差for (int i = 0;i < n_f;++i) {//dsize 字典中单词的长度//fsize file 中单词的长度 fsize = strlen(file[i]);//flag 向输出模块传递信息, 0没有相似单词, 1存在相似单词, 2存在correctflag = 0;dif_num = -1;int ans_p = 0;for (int j = 0;j < n_d;++j) {dsize = strlen(dic[j]);dif_size = dsize - fsize;if (-1 <= dif_size || dif_size <= 1) {//长度差不超过1才会比较if (dsize > fsize)dif_num = com(dic[j], file[i], dsize, 0);else if (fsize > dsize)dif_num = com(file[i], dic[j], fsize, 0);elsedif_num = com(file[i], dic[j], fsize, 1);}if (dif_num == 0) {flag = 2;break;}else if (dif_num == 1) {flag = 1;ans[ans_p++] = dic[j];}}if (flag == 0)//输出模块, 根据 flag 输出不同的结果printf("%s:", file[i]);else if (flag == 1) {printf("%s:", file[i]);for (int k = 0;k < ans_p;++k)printf(" %s", ans[k]);}elseprintf("%s is correct", file[i]);printf("\n");}return 0;}


原创粉丝点击