北理工程序设计题目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的值。
Sample Input
HELLOWORLD
LOWER
Sample Output
1
Hint
保证字符均为英文字母,且S、T长度不超过100.
#include <stdio.h>
#include <string.h>
int main(){
int a,count,i,k,n,t;
int flag[100];
char S[120];
gets(S);
char T[120];
gets(T);
int len1=strlen(S);
int len2=strlen(T);
if(len1>=len2){
for(i=0;i<=len1-len2;i++){
count=0;
for(n=0;n<=len2-1;n++){
t=i+n;
if(T[n]==S[t]){
count++;
}
}
flag[i]=len2-count;
}
a=flag[0];
for (k = 0; k <=len1-len2; k++) {
if (flag[k] < a) {
a= flag[k];
}
}
printf("%d\n",a);
}
if(len1<len2){
printf("-1\n");
}
}