zoukankan      html  css  js  c++  java
  • 最长公共子串

    (连续) - 阿里笔试【分析+编码】

     

     

    题目描述:给定一个query和一个text,均由小写字母组成。要求在text中找出以同样的顺序连续出现在query中的最长连续字母序列的长度。例如,query为“acbac”,text为“acaccbabb”,那么text中的“cba”为最长的连续出现在query中的字母序列,因此,返回结果应该为其长度3。请注意程序效率。

     

    【思路】用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置.

     

    当字符匹配的时候,不是简单的给相应元素赋上1,而是赋上其左上角元素的值加1。我们用两个标记变量来标记矩阵中值最大的元素的位置,在矩阵生成的过程中来判断当前生成的元素的值是不是最大的,据此来改变标记变量的值,那么到矩阵完成的时候,最长匹配子串的位置和长度就已经出来了。

     

    实例如下:

         a    c    b    a    c

    a   1    0    0    1    0   

    c   0    2    0    0    2

    a   1    0    0    1    0

    c   0    2    0    0    2

    c   0       0    0    1

    b   0    0    2    0    0

    a   1    0    0    3    0    

    b   0    0    1    0    0

    b   0    0    1    0    0

    (红色为最长公共子串)

     

     

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    #include <cstring>

    #include <cstdio>

    #define M 1010

     

    int LCS(char query[], char text[])

    {

        int len_query=strlen(query),len_text=strlen(text);

     

        //数组c记录匹配情况,模拟二维矩阵

        char c[len_text];

        int len, i, j;

        len=0;

     

        for(i=0; i<len_query; i++)

        {

            //不反过来会把之前数组元素冲掉的,因为后面的元素需要根据前面的元素计算【很巧妙,只用一个数组,迭代记录每一列的数值】

            for(j=len_text-1; j>=0; j--)

            {

                if(query[i] == text[j])

                {

                    if(i==0 || j==0)

                        c[j]=1;

                    else

                        c[j]=c[j-1]+1; 

                }

                else

                    c[j] = 0;

     

                if(c[j] > len)

                    len=c[j];

            }

        }

        return len;

    }

     

    int main()

    {

        char str1[M],str2[M];

        printf("请输入字符串query:");

     

        scanf("%s", str1);

        printf("请输入字符串text:");

     

        scanf("%s", str2);

        printf("所求长度为:");

     

        printf("%d ",LCS(str1,str2));

        return 0;

     

    }

  • 相关阅读:
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    Centos安装openjdk
    centos7安装nodejs
    Linux服务器集群性能监控之Performance Co-Pilot(PCP)部署
    asp.net(c#)网页跳转七种方法小结
    C# 获取文件名及扩展名
    C#中的 具名参数 和 可选参数
    数据契约(DataContract)
    用LINQ在集合中查询特定对象
    jQuery中append、insertBefore、after与insertAfter方法注意事项
  • 原文地址:https://www.cnblogs.com/lsx1993/p/4841562.html
Copyright © 2011-2022 走看看