zoukankan      html  css  js  c++  java
  • [算法]相似字符串

    这是微软编程之美比赛2013初试的一道题,题目如下:

    描述

    对于两个长度相等的字符串,我们定义其距离为对应位置不同的字符数量,同时我们认为距离越近的字符串越相似。例如,“0123”和“0000”的距离为 3,“0123”和“0213”的距离则为 2,所以与“0000”相比,“0213”和“0123”最相似。

    现在给定两个字符串 S1 和 S2,其中 S2 的长度不大于 S1。请在 S1 中寻找一个与 S2 长度相同的子串,使得距离最小。

    输入

    输入包括多组数据。第一行是整数 T,表示有多少组测试数据。每组测试数据恰好占两行,第一行为字符串 S1,第二行为 S2。所有字符串都只包括“0”到“9”的字符。

    输出

    对于每组测试数据,单独输出一行“Case #c: d”。其中,c 表示测试数据的编号(从 1 开始),d 表示找到的子串的最小距离。

    数据范围

    1 ≤ T ≤ 100

    小数据:字符串长度不超过 1000

    大数据:字符串长度不超过 50000

    样例输入
    3
    0123456789
    321
    010203040506070809
    404
    20121221
    211
    样例输出
    Case #1: 2
    Case #2: 1
    Case #3: 1



    这道题的蛮力法解还是比较容易想到的,蛮力算法是将s2与s1的每个长度与之相等的子字符串进行比较,时间负责度应该是O(len(s1)*len(s2)),但是明显它应该有更好的算法。

    import java.util.Scanner;
    
    public class SimStr {
        public static void main(String[] args){
            System.setIn(fis); 
            Scanner S=new Scanner(System.in);
            int T=S.nextInt();
            S.nextLine();
            for(int t=0;t<T;t++){
                System.out.print("Case #"+(t+1)+": ");
                String s1=S.nextLine();
                String s2=S.nextLine();
                int m=s1.length();
                int n=s2.length();
                char[] s1Chars=s1.toCharArray();
                char[] s2Chars=s2.toCharArray();
                int[][] nums=new int[10][1000];
                int[] ans=new int[1000];
                for(int i=0;i<m;i++){
                    int dig=Integer.parseInt(String.valueOf(s1Chars[i]));
                    nums[dig][0]++;
                    nums[dig][nums[dig][0]]=i;
                }
                for(int i=0;i<n;i++){
                    int dig=Integer.parseInt(String.valueOf(s2Chars[i]));
                    for(int j=1;j<=nums[dig][0];j++){
                        if(nums[dig][j]-i>=0){
                            ans[nums[dig][j]-i]++;
                        }
                    }
                }
                int max=0;
                for(int i=0;i<m;i++){
                    if (ans[i]>max){
                        max=ans[i];
                    }
                }
                System.out.println(n-max);
            }
            S.close();
        }
    
    }

    这种算法明显是比蛮力法好些的,应该还存在更快的方法。

  • 相关阅读:
    牛客练习赛53 B题调和级数
    装备购买(线性基)
    杨氏矩阵与勾长公式
    南昌邀请赛B题(拉格朗日插值)
    徐州网络赛补题
    __int128 输入输出模板
    51 nod1067 Bash游戏 V2(sg函数打表)
    堆优化的dijkstra算法
    ST表求区间最值
    Tree Reconstruction
  • 原文地址:https://www.cnblogs.com/orchid/p/3023196.html
Copyright © 2011-2022 走看看