数据结构与算法MOOC 数据结构与算法MOOC / 第十章 检索 练习题(Excercise for chapter10 retrieval)1:拼写检查

数据结构与算法MOOC 数据结构与算法MOOC / 第十章 检索 练习题(Excercise for chapter10 retrieval)1:拼写检查

  • AC代码
  • 解题思路
    • 匹配
    • 搜索

题目链接:http://dsalgo.openjudge.cn/retrieval/1/

AC代码

#include 
#include 

char words[10001][16], buff[10001][16], check[16];
int n_words, it;

bool loose_match(const char *s1, const char *s2) {
    size_t l1 = strlen(s1), l2 = strlen(s2), it1, it2;
    if (l1 == l2) {
        for (it1 = 0; s1[it1] && s1[it1] == s2[it1]; ++it1);
        if (!s1[it1]) return true;
        for (it2 = l1 - 1; s1[it2] == s2[it2]; --it2);
        return it1 >= it2;
    } else if (l1 == l2 + 1) {
        for (it1 = 0; s1[it1] == s2[it1]; ++it1);
        for (it2 = l2; s1[it2] == s2[it2 - 1]; --it2);
        return it1 >= it2;
    } else if (l2 == l1 + 1) {
        for (it1 = 0; s1[it1] == s2[it1]; ++it1);
        for (it2 = l1; s2[it2] == s1[it2 - 1]; --it2);
        return it1 >= it2;
    } else return false;
}

int main() {
    n_words = 0;
    while (gets(words[n_words]), words[n_words++][0] != '#');
    n_words--;
    while (gets(check), *check != '#') {
        it = 0;
        bool matched = false;
        for (int i = 0; i < n_words; ++i) {
            if (strcmp(words[i], check) == 0) {
                matched = true;
                break;
            } else if (loose_match(words[i], check))
                strcpy(buff[it++], words[i]);
        }
        if (matched) printf("%s is correct\n", check);
        else {
            printf("%s:", check);
            for (int i = 0; i < it; ++i)
                printf(" %s", buff[i]);
            putchar('\n');
        }
    }
    return 0;
}

解题思路

匹配

题目要求两个单词相仅有插入、删除、替换一个字母这三种可能性。所以如果两个序列长度之差≥2的话,它们是不可能相似的。只需要考虑序列长度相等或差1这两种情况。

  1. 如果两个字符串长度相等,但不完全匹配的话,还有可能是替换一个字母后的相似,这时只需遍历字符串,允许有一个字符失配,如果恰有一个字符失配,说明两个单词不相同但相似
  2. 如果两个字符串长度差1,那么还有可能是较长的字符串删去一个字符与较短字符串相同(也即较短字符串插入一个字符后与较长字符串相同),这时,对两个字符串进行比较,在发生一次失配后,较长字符串的的迭代器(指针)后移一位,如果之后能够完全匹配,那么说明两个序列是相似的

搜索

仅就这道题而言,使用最朴素(最暴力)的方法,用一个线性表来存储所有单词然后每次查找都遍历一遍这个线性表,是可以AC的。]想优化这个存储和搜索的过程是比较困难的。

你可能感兴趣的:(数据结构与算法MOOC 数据结构与算法MOOC / 第十章 检索 练习题(Excercise for chapter10 retrieval)1:拼写检查)