【编程题目】最长公共字串

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;
}

【编程题目】最长公共字串

时间: 2024-10-13 04:14:39

【编程题目】最长公共字串的相关文章

URAL 1517 Freedom of Choice(后缀数组,最长公共字串)

题目 输出最长公共字串 #define maxn 200010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];}//yuan lai zhi qian ba zhe li de l cuo dang cheng 1 le ... void da(int *r,int *sa,int n,int m) { int i,j

最长递归子序列、最长公共字串、最长公共子序列、编辑距离

[TOC]   ### 最长递归子序列 #### 题目 给定数组arr,返回arr中的最长递增子序列,如`arr=[2,1,5,3,6,4,8,9,7]`,返回的最长递增子序列为`[1,3,4,8,9]` #### 题解思路 先用DP来求解子序列递增的最大长度,如arr的长度序列为`dp=[1,1,2,2,3,3,4,5,4]`,然后对这个长度序列dp从右到左遍历,得到最长递增子序列. 1. 求解长度序列,令dp[i]表示在以arr[i]这个数结尾的情况下,arr[0...i]中的最大递增子序列

搜索里的相似度计算-最长公共字串

相似度计算的任务是根据两段输入文本的相似度返回从0到1之间的相似度值:完全不相似,则返回0,:完全相同,返回1.衡量两端文字距离的常用方法有:海明距离(Hamming distance),编辑距离,欧氏距离,文档向量的夹角余弦距离,最长公共字串. 1. 余弦相似度 把两篇文档看作是词的向量,如果x,y为两篇文档的向量,则:Cos(x, y) = (x * y) / (||x|| * ||y||) 使用Hashmap可以很方便的把这个计算出来 2. 最长公共字串(Longest Common Su

最长公共子序列与最长公共字串

显然最长公共子序列不一定需要连续的,只要字符的顺序严格递增即可.最长公共字串需要字符连续 子序列代码: package test; import java.util.*; /* * 本题是求最长公共子序列,子序列未必连续,只需要严格递增即可 * 如 abcdeeeeeeeee和atttbggcd 最长公共子序列为abcd 长度为4 * * */ public class Main4{ public static void main(String... args){ try(Scanner in

(字符串)最长公共字串(Longest-Common-SubString,LCS)

题目: 给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa].二者的最长公共子串为[aba],长度为3. 子序列是不要求连续的,字串必须是连续的. 思路: 1.简单思想: 遍历两个字符串X.Y,分别比较X的字串与Y的字串,求出最长的公共字串. #include <iostream> #include <vector> using namespace std; int getComLen(char *str1,char *str2){ int len=

poj 3080 kmp求解多个字符串的最长公共字串,(数据小,有点小暴力 16ms)

Blue Jeans Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14113   Accepted: 6260 Description The Genographic Project is a research partnership between IBM and The National Geographic Society that is analyzing DNA from hundreds of thousa

Problem 2902 - palindrome(最长公共字串)

Longest PalindromeTime Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu SubmitStatus Description Problem D: Longest Palindrome Time limit: 10 seconds A palindrome is a string that reads the same from the left as it does from the right.

lintcode_79最长公共字串

给出两个字符串,找到最长公共子串,并返回其长度. 样例 给出A="ABCD",B="CBCE",返回 2 class Solution: """ @param: A: A string @param: B: A string @return: the length of the longest common substring. """ def longestCommonSubstring(self, A,

POJ 2774 (后缀数组 最长公共字串) Long Long Message

用一个特殊字符将两个字符串连接起来,然后找最大的height,而且要求这两个相邻的后缀的第一个字符不能在同一个字符串中. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int maxn = 200000 + 10; 7 8 char s[maxn]; 9 int n; 10 int sa[maxn], rank[maxn],