字符距离
问题描述
对于两个长度相等的字符串,我们定义其距离为对应位置不同的字符数量,同时我们认为距离越近的字符串越相似。例如,“0123”和“0000”的距离为 3,“0123”和“0213”的距离则为 2,所以与“0000”相比,“0213”和“0123”最相似。
现在给定两个字符串 S1 和 S2,其中 S2 的长度不大于 S1。请在 S1 中寻找一个与 S2 长度相同的子串,使得距离最小。
输入格式输入包括多组数据。第一行是整数 T,表示有多少组测试数据。每组测试数据恰好占两行,第一行为字符串 S1,第二行为 S2。所有字符串都只包括“0”到“9”的字符。
1 ≤ T ≤ 100
小数据:字符串长度不超过 1000
大数据:字符串长度不超过 50000输出格式对于每组测试数据,单独输出一行“Case #c: d”。其中,c 表示测试数据的编号(从 1 开始),d 表示找到的子串的最小距离。样例输入3
0123456789
321
010203040506070809
404
20121221
211样例输出Case #1: 2
Case #2: 1
Case #3: 1
解法一:紧凑的暴力搜索法
#include <stdio.h> #include <iostream> #include<algorithm> #include <math.h> #include <string.h> #include <vector> using namespace std; char s1[50001]; char s2[50001]; int main() { int t,i,j,k; scanf("%d",&t); for(k=1;k<=t;k++) { int min = -1,count=0; scanf("%s",s1); scanf("%s",s2); int l1=strlen(s1); int l2=strlen(s2); for(j=0;j<l2;j++) if(s1[j]!=s2[j]) count++; min = count; for(i=1;i<=l1-l2;i++) { count = 0; for(j=0;j<l2;j++) { if(s1[i+j]!=s2[j]) { count++; if(count>=min) break; } } if(count<min) min = count; if(min==0) break; } printf("Case #%d: %d\n",k,min); } return 0; }
解法二: