zoukankan      html  css  js  c++  java
  • 【编程题目】最长公共字串

    56.最长公共字串(算法、字符串)。
    题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,
    则字符串一称之为字符串二的子串。
    注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。
    请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。
    例如:输入两个字符串 BDCABA 和 ABCBDAB,字符串 BCBA 和 BDAB 都是是它们的最
    长公共子串,则输出它们的长度 4,并打印任意一个子串。

    经典动态规划题。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void printLCS(char * X, int m, int n, int i, int j, char * B) 
    {
        if (i < 0 || j < 0)
        {
            return;
        }
        char b = *(B + i * n + j);
        if (b == 'y')
        {
            printLCS(X, m , n, i - 1, j - 1, B);
            printf("%c ", X[i]); //先得到的是后面的共同字母,应该在后面打印出来
        }
        else if (b == 'u')
        {
            printLCS(X, m , n, i - 1, j, B);
        }
        else
        {
            printLCS(X, m , n, i, j - 1, B);
        }
    }
    
    int LCS(char * X, char * Y, int m, int n, char * & B) //返回最大公共子串的长度
    {
        int * C = (int *)malloc((m + 1) * (n + 1) * sizeof(int)); //记录每个子问题的最长公共子序列 0-m 0-n
        B = (char *)malloc(m * n * sizeof(char)); //标记 1-m 1-n
        memset(C, 0, (m + 1) * (n + 1) * sizeof(int)); //初始化为全0
    
        for (int i = 0; i < m; i++)
        {
            int * crow_1 = C + i * (n + 1); //注意 C 中 i = 1 j = 1 对应 X的X[0] 与 Y的Y[0]
            int * crow = C + (i + 1) * (n + 1);
            char * brow = B + i * n;  //注意 B 中 i = 0 j = 0 对应 X的X[0] 与 Y的Y[0]
            for(int j = 0; j < n; j++)
            {
                if (X[i] == Y[j])
                {
                    crow[j + 1] = crow_1[j] + 1;
                    brow[j] = 'y';
                }
                else
                {
                    crow[j + 1] = (crow_1[j + 1] > crow[j]) ? crow_1[j + 1] : crow[j];
                    brow[j] = (crow_1[j + 1] > crow[j]) ? 'u' : 'l';
                }
            }
        }
    
        printLCS(X, m, n, m - 1, n - 1, B);
        int maxlen = *(C + m * (n + 1) + n);
        free(C);
        free(B);
        return maxlen;
    }
    
    int main()
    {
        char X[7] = {'A','B','C','B','D','A','B'};
        char Y[6] = {'B','D','C','A','B','A'};
        char * B = NULL;
        int l = LCS(X, Y, 7, 6, B);
    
        return 0;
    }
  • 相关阅读:
    基于VIP的keepalived高可用架构
    高性能Nginx最佳实践
    Ubuntu安装Nginx
    Synchronized总结及底层原理分析#网易微专业# #Java#
    springboot Restful开发
    Volatile详解
    IOC知识点详细汇总
    python 一个函数让你决定你的二维码
    用python批量生成简单的xml文档
    基于tensorflow搭建一个神经网络
  • 原文地址:https://www.cnblogs.com/dplearning/p/3911991.html
Copyright © 2011-2022 走看看