字符距离

问题描述

对于两个长度相等的字符串,我们定义其距离为对应位置不同的字符数量,同时我们认为距离越近的字符串越相似。例如,“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;
}

 

解法二:

posted @ 2017-12-10 13:57  萌新上路  阅读(218)  评论(0编辑  收藏  举报