首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用C++找到最长公共子串

对于这个问题,可以使用C++中的动态规划算法来找到最长公共子串。以下是一个基本的实现步骤:

  1. 定义一个二维数组dp,其中dpi表示字符串s的第i到第j个字符之间的子串是否是另一个字符串t的第i到第j个字符之间的子串的最长公共子串。
  2. 初始化dp数组,使得dp0和dp0(j>0)都等于true,表示空字符串是另一个字符串的最长公共子串。
  3. 从左到右,从上到下遍历字符串s和t,对于s的第i个字符和t的第j个字符,如果它们相等,则dpi等于dpi-1和dpi-1中的较大值,否则dpi等于false。
  4. dps.length()等于true,表示整个字符串s和t本身就是最长公共子串。
  5. 最后,对于所有dpi为true的子串,从i=0到i=j,取出最长的一个,就是最长公共子串。

以下是一个简单的C++代码实现:

代码语言:c++
复制
#include <iostream>
#include <string>
using namespace std;

bool isCommonSubstr(string s, string t) {
    int m = s.length(), n = t.length();
    bool dp[m+1][n+1];
    memset(dp, false, sizeof(dp));
    dp[0][0] = true;
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            if (i == 0 && j == 0) {
                continue;
            }
            if (s[i-1] == t[j-1]) {
                dp[i][j] = dp[i-1][j-1] || dp[i-1][j];
            } else {
                dp[i][j] = false;
            }
        }
    }
    return dp[m][n];
}

int main() {
    string s = "abcde";
    string t = "bcdef";
    if (isCommonSubstr(s, t)) {
        cout << "最长公共子串是: " << s.substr(0, t.length()) << endl;
    } else {
        cout << "没有找到公共子串" << endl;
    }
    return 0;
}

以上代码中,我们使用了一个bool类型的二维数组dp来记录字符串s和t的每个子串是否是另一个字符串的最长公共子串。在主函数中,我们输入两个字符串s和t,然后调用isCommonSubstr函数来检查它们是否是公共子串,如果是,则输出最长公共子串,否则输出提示信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

最长公共+最长公共序列

最长公共(注意是连续的) 1、先建立一个二维数组array[str1.size()][str2.size()](全部初始化为0),初始化第一行和第一列(元素相同处置1),然后进入状态方程 2、状态转移方程...3、最后寻找整个array中的最大值即可(因为可能有多个子) 示意(图中有两个公共,分别为"ab"和"de",长度都为2) ?...程序: 1 /* 2 本程序说明: 3 4 最长公共(注意空格,不要用cin,要用getline) 5 6 */ 7 #include 8 #include...1 /* 2 本程序说明: 3 4 最长公共序列 5 6 */ 7 #include 8 #include 9 #include <string...1 /* 2 本程序说明: 3 4 最长公共序列(加上了其中一个序列的打印功能,回溯法) 5 6 */ 7 #include 8 #include <vector

2.6K30

最长公共序列与最长公共

最长公共序列 举个例子:s1="abcfde",s2="bcde"。那么s1与s2的最长公共序列就是"bcde",注意不要求连续。该问题是典型的动态规划问题。...(i, j)从0开始,那么递推关系很容易找到:(maxLen(i,j)表示s1字符左边i个字符构成的与s2左边j个字符构成的最长公共序列长度,下同) if(s1[i-1] == s2[j-...最长公共与上述最长公共序列不一样,最长公共要求连续。...例如s1="asdfddsx",s2="asssdfed",那么s1与s2的最长公共是:"sdf"。...最长公共的输出比上面最长公共序列简单,因为后者一定是连续的,我们只要保存最后一个两个字符字符相等的位置index,以及最长公共的长度length,然后从index位置往回倒推index个字符即可

95710

最长公共

前言 动态规划是大厂的热门考点,其中最长公共最长公共序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共,图文并茂,...输出: 2 解释: 最长公共为 ad,所以结果为 2 这里需要简单解释下子序列的区别,要求这字符在原字符中是连续的,而序列可以不连续,两者的区别如下: ?...y 的 前 j-1 个字符最长公共 + 1,如下图示 ?...2、 如果 x 的第 i 个字符与 y 的第 j 个字符不相等,那么显然 dp[i][j] = 0,因为 dp[i][j] 定义为最长公共,所以只要有一个字符不相等,就说明不满足最长公共这个定义...问题变形 以上我们只是简单求了一下最长公共的长度,那如何求其对应的呢。

2.6K30

最长公共

题目: 思路: 如图: 思路一,利用动态规划的方法,列出全部结果来寻找规律,我们发现45度下滑,如果连续相等的话我们可以做递加,不但可以得出最长的字符数量还可以知道字符的位置。...思路二,这是我看别人提供的一种思路,通过将一个字符截取部分,然后判断是否在另一个字符中,然后不断偏移直至全部比对完,这种空间上会相对思路一节约很多,毕竟少存了个数组。...     * 如:arr[2][2] = 1 则表示两个字符相等 ,      * 而arr[3][3] = 2 , 表示承接上一个相同的字符,再一次相同      * 这样可以通过获取最大值的同时获取到连续字符的最终位置...     *      * @param str1 string字符 the string      * @param str2 string字符 the string      * @return...string字符      */     public static String LCS(String str1, String str2) {         if (str1 == null

45320

最长公共 序列

本文记录寻找两个字符最长公共序列的方法。...名词区别 最长公共(Longest Common Substring)与最长公共序列(Longest Common Subsequence)的区别: 要求在原字符中是连续的,而序列则只需保持相对顺序...最长公共 是指两个字符最长连续相同的长度。 例如:str1=“1AB2345CD”,str2=”12345EF”,则str1,str2的最长公共为2345。...最长公共序列 要求字符必须是连续的,但是序列就不是这样。 最长公共序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。...解法就是用动态回归的思想,一个矩阵记录两个字符中匹配情况,若是匹配则为左上方的值加1,否则为左方和上方的最大值。一个矩阵记录转移方向,然后根据转移方向,回溯找到最长子序列。

3.8K40

最长公共- LCS 算法

LCS (Longest Common Subsequence) 算法 已知字符str1="网站高并发解决方案",str2="如何解决网站高并发",如何字符最长公共?...lcs 算法原理 将2个字符采用行列 排列: 如 何 解 决 网 站 高 并 发 网 站 高 并 发 解...0 0 0 0 方 0 0 0 0 0 0 0 0 0 案 0 0 0 0 0 0 0 0 0 同时我们可以优化: 很明显,通过坐标可看到,相同的坐标已经标位1,通过计算连续对角线长度,即可比对出最长字符...0 0 0 0 0 0 5 解 0 0 1 0 0 0 0 0 0 决 0 0 0 2 0 0 0 0 0 方 0 0 0 0 0 0 0 0 0 案 0 0 0 0 0 0 0 0 0 在判断字符时...,记录当前最大值与当前最大值坐标,判断完毕之后,即可通过记录的最大坐标获取到最长字符最后的坐标值 python实现算法: #!

1.1K20

最长公共序列问题

必须是连续的,序列可以是非连续的。这两个问题属于经典的dp问题。 最长公共 给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长数组的长度。...给定两个字符 text1 和 text2,返回这两个字符最长公共序列的长度。...例如,”ace” 是 “abcde” 的序列,但 “aec” 不是 “abcde” 的序列。两个字符的「公共序列」是这两个字符所共同拥有的序列。...若这两个字符没有公共序列,则返回 0。 示例 1: 输入:text1 = "abcde", text2 = "ace" 输出:3 解释:最长公共序列是 "ace",它的长度为 3。...两个字符的删除操作(leetcode583) 给定两个单词 word1 和 word2*,找到使得 *word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符中的一个字符。

61340

【动态规划】最长公共问题

题目来源为:牛客网 题目有意思的地方在于,最长公共最长连续公共都是比较经典的问题,但是这道题在其基础上加了限制。 首先这道题应该是最长连续公共问题,状态转移方程就不写了,挺简单的。...就记录下最大的所在的位置的行坐标和列坐标,就能把子拿到手。 但是对于O(nm)的动态规划所有点都会超时,这就很厉害了,目前通过的做法使用的是滑动窗口法,我还在研究。...就假设str1和str2之间存在着一个长度为maxlen的最大子,开始位置在maxbeg。一个很显然的情况是,该一定是通过滑动窗口的方式过去的。...因此,该滑动窗口一定能匹配到最大连续公共C++题解,不过只有93%的击败率。应该是一些细节吧,比如使用数组会比vector要快一些等。...P //根据P构建next数组 vector nxt(P.length(),0); size_t point = 1;

25720

对数据进行模糊匹配搜索(动态规划、最长公共最长公共序列)

目前主流做法是通过最长公共来寻找两个或多个已知字符最长。...注:深拷贝使用了依赖库,需先安装 npm install mazey --save 最长公共示例: import { deepCopy } from 'mazey'; /** * @method...fish', 'finish'); // 3 “fish” 和 “finish” 除了 “ish” 之外还共同包含 “f”,所以 “ish” + “f” 更好的表达其相似性(3 + 1 = 4),于是使用最长公共序列对最长公共进行升级来查找所有序列中最长子序列...,版本管理中使用的 git diff 就是建立在最长公共序列的基础上。...最长公共序列 - 力扣(LeetCode) 搜索引擎如何做到模糊匹配? 版权声明 本博客所有的原创文章,作者皆保留版权。

29540
领券