首页 > 其他分享 >lCS(最长公共子串)

lCS(最长公共子串)

时间:2024-04-15 10:22:23浏览次数:21  
标签:子串 遍历 下标 lCS int 个字符 最长 dp

之前一直写的最长公共子序列,从来没写过最长公共子串这个算法,也因为这个,在今年的蓝桥杯省赛中有个题目用的暴力字符串匹配,导致了丢分(也可能拿不到省一了,哎)

其实就是一个二维的dp,dp[i][j]表示第一个以i结尾,第二个以j结尾的最长长度。

1 初始化,第一个串的下标按行存储,第二个串的下标按列存储。第一列按行遍历,表示当前在第一个串s的第i个字符时,t串的第1个字符时,是否相等。
按列遍历,表示s串第一个字符和t串的第j个字符是否相等。

2 状态转移 如果s[i] == t[j] , dp[i][j] = dp[i - 1][j - 1] + 1,否则 = 0;

3 输出结果 在遍历的过程中保留结果即可。

4 拓展 如何输出这个串?在遍历的过程中如果ans被更新,则记录某个串的结尾下标,然后直接按记录的下标-ans输出即可。

void solve(){
string s, t;
cin >> s >> t;

int n = s.size();
int m = t.size();

vector<vector<int>> dp(n + 1, vector<int>(m + 1));
for (int i = 1; i <= n; ++i){
    if (s[i - 1] == t[0]){
        dp[i][1] = 1;
    }
}
for (int i = 1; i <= m; ++i){
    if (t[i - 1] == s[0]){
        dp[1][i] = 1;
    }
}

int ans = 0;
int index = 0;
for (int i = 1; i <= n; ++i){
    for (int j = 1; j <= m; ++j){
        if (s[i - 1] == t[j - 1]){
            dp[i][j] = dp[i - 1][j - 1] + 1;
        }
        else{
            dp[i][j] = 0;
        }
        if (changeMax(ans, dp[i][j])){
            index = i - ans;
        }
    }
}

cout << ans << '\n';
cout << s.substr(index, ans) << '\n';

}

标签:子串,遍历,下标,lCS,int,个字符,最长,dp
From: https://www.cnblogs.com/yxcblogs/p/18135286

相关文章

  • 最长递增子序列leetcode的总结
    使用动态规划解决,首先明白dp数组的含义dp[i]表示在位置i时最长的递增子序列dp[i]=max(dp[j]+1,dp[i])为递推公式初始化dp[i]=1都初始化为1因为最基本的每一个位置至少为一个遍历顺序for(inti=2;i<len;i++){            for(intj=0;j<i;j++){if(n......
  • unordered_map在计算最大长度的无重复字符子串的作用总结
    例如:abcadfee计算结果为3,即abc或adf这里定义一个unordered_map<char,int>的哈希表,键为字符,值为该字符的下标intleft=0,len=0;for(inti=0;i<s.length();i++){charc=str[i];if(hash.count(c)){len=max(len,i-left);//计算最大长度left=max(left,hash[c]+1);//就算左指针......
  • 516. 最长回文子序列
    题目链接:本题考察区间\(dp\)。设\(f[i][j]\)表示子串\(i\simj\)中的最长回文子序列的长度。思考状态转移方程。因为是判断回文的问题,考虑首尾元素是否相同。若首尾元素相同,则考虑去掉首尾元素之后子串的最长回文子序列的长度+2(首、尾元素各一个)反之若首尾元素不相同......
  • 最长公共子序列(线性dp)-java
    本文主要来描述两个字符串的最长公共子序列问题文章目录前言一、最长公共子序列二、算法思路1.dp[i][j]的四种情况2.dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]的关系3.dp数组的状态转移方程 4.dp数组具体如下三、代码如下1.代码如下(示例):2.读入数据3.代码运行结......
  • 求字符串的连续最长字串
    前言给定一个字符串,求连续字符最长子串,比如aaaacabbbbbbbc,输出七个b。(牛客上看到的面试手撕题,闲着没事实现了一下)#include<iostream>#include<map>#include<algorithm>usingnamespacestd;intmain(){strings;cin>>s;intcount=1;......
  • 【华为OD机试真题】217、最长广播响应 | 机试真题+思路参考+代码分析(C语言、C++、Java
    文章目录一、题目......
  • 最长子串
    ......
  • 无重复字符的最长子串
    给定一个字符串s,找出其中不包含重复字符的最长子串的长度。例如字符串abcabcd子串分为abc abcdabcd的长度最长。思路:将一个字符串分为多个子串,用二维数组存储起来,最后利用strlen()获取子串长度,超出最长子串。第一阶段:将字符串分为多个子串。可以用二维数组来存储子串,暂用in......
  • 最长上升子序列——二分法
    前置设lowilow_ilowi​:长度为......
  • 128.最长连续序列
    题干给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nu......