N-40. String pattern matching

Description

字符串的模式匹配是一种常用的运算。所谓模式匹配,可以简单地理解为在目标(字符串)中寻找一个给定的模式(也是字符串),返回目标和模式匹配的第一个子串的首字符位置。通常目标串比较大,而模式串则比较短小。

对于字符串较长的模式匹配问题,我们可以使用克努特—莫里斯—普拉特操作(即KMP算法)解决,KMP算法的时间复杂度O(m+n).对于字符串较短的匹配问题,我们也可以使用简单算法解决。请解决如下字符串的模式匹配问题:

给定字符串S与T,规定S上操作REPLACE(i, x)表示为将S中第i个字符更改为x.

求最小操作次数a,使得T为S的子串。当任意次操作均不能使得T为S字串时,输出-1.

Input

两行,共两个字符串,即S、T.

Output

一行,即a的值。

思路
KMP算法比较复杂,在此不再赘述。
因为两个字符串长度较小,我们直接比较:
设b串的长度为n,
我们从a串开头遍历,每次比较n个数,更新一下cnt(相同字符的个数)
答案就是 n - cnt

#include <stdio.h>  
#include <string.h>  
int max (int a, int b) {  
    return a > b ? a : b;  
}  
int main () {  
    int ans = 0;  
    char s[110], t[110];  
    gets(s); gets(t);  
    int m = strlen(s), n = strlen(t);  
    if (m < n) printf("-1\n");  // 特判
    else {  
      
    for (int i = 0; i <= m - n; i++) {  
        int cnt = 0;  
        for (int j = 0; j < n; j++)   
            if (s[i + j] == t[j]) cnt++;  
        ans = max(ans, cnt);  
    }  
    printf("%d\n", n - ans);  
    }  
    return 0;  
}  

posted @ 2022-04-20 19:38  misasteria  阅读(67)  评论(0编辑  收藏  举报