首页 > 其他分享 >求最长公共子串的两种解法

求最长公共子串的两种解法

时间:2024-11-13 21:17:53浏览次数:3  
标签:子串 string temp str2 str1 ans 最长 解法

描述

给定两个字符串str1和str2,输出两个字符串的最长公共子串

题目保证str1和str2的最长公共子串存在且唯一。 

数据范围: 1≤∣str1∣,∣str2∣≤50001≤∣str1∣,∣str2∣≤5000
要求: 空间复杂度 O(n2),时间复杂度 O(n2)

实例:

输入:
"1AB2345CD","12345EF"
返回值:
"2345"

备注:

1≤∣str1∣,∣str2∣≤5000

因为本题时间复杂度满足n^2即可,所以我们采用暴力枚举的方法将两个字符串进行逐个字符比价然后求出最长子串即可。

法一:

class Solution {
public:
    string LCS(string str1, string str2) {
    string ans;
    string temp;
    for(int i=0;i<str1.size();i++){
        for(int j=0;j<str2.size();j++){
            if(str1[i]==str2[j]){
                int x=i,y=j;
                while (str1[x]==str2[y]) {
                x++;y++;
                temp+=str1[x-1];
                }
                if(temp.size()>ans.size()){
                    ans=temp;
                }
                temp.clear();
            }
        }
    }
    return ans;
    }
};

法一思路比较简单,通过定义两个新的字符串ans和temp,通过双重循环将原输入的str1和str2进行比较,如果有字符相等则新定义两个整形x、y来记录此时相同的字符分别在str1和str2中的位置i和j,再通过循环判断该位置后面的字符是否也相等,将寻找出的子串存储在temp中,接着比较ans和temp的长度,如果temp>ans则ans=temp,最后将temp清空继续下一轮循环。

法二:

class Solution {
public:
    string LCS(string str1, string str2) 
    {
      vector<vector<int>> dp(str1.size()+1,vector<int>(str2.size()+1,0));
      int max=0,pos=0;
      for(int i=0;i<str1.size();++i)
      {
        for(int j=0;j<str2.size();++j)
        {
            if(str1[i]==str2[j])
            {
                dp[i+1][j+1]=dp[i][j]+1;
            }
            if(dp[i+1][j+1]>max)
            {
                max=dp[i+1][j+1];
                pos=i;
            }
        }
      }
      return str1.substr(pos-max+1,max);
    }
};

法二通过开辟一个二维数组来存储存在的相同子串长度有哪些以及对应位置,通过  dp[i+1][j+1]=dp[i][j]+1来实现连续子串长度的增加,最后通过找出最大子串长度然后截取其对应在str1中的位置并返回。

标签:子串,string,temp,str2,str1,ans,最长,解法
From: https://blog.csdn.net/2401_86655821/article/details/143752320

相关文章

  • leetcode 59. 螺旋矩阵 II java解法
    以123456789为例n=奇数结果1                2                3      i8                9                47                6             ......
  • 【PAT_Python解】1125 子串与子列
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!测试点5超时:defmin_window_substring(s,p):len1=len(s)len2=len(p)mixn=0min_length=len1+1#设置为一个较大的值......
  • 代码随想录算法训练营day43| 300.最长递增子序列 674. 最长连续递增序列 718. 最长
    学习资料:https://programmercarl.com/0300.最长上升子序列.html#算法公开课动态规划系列之子序列学习记录300.最长递增子序列(长度最少为1;dp[i]代表到i为止的最长子序列的长度;i的值根据i之前比如j的值来判断;每个地方都有可能获得最长长度)点击查看代码classSolution:def......
  • 76. 最小覆盖子串
    题目链接解题思路求最小子串问题,第一时间,想「以i开头的结果是什么」,求出所有的结果,最优的便是;或者「以i结尾的结果是什么」,求出所有的结果,最优的便是这个题使用「以i开头的结果是什么」,假设是[i,j]然后再求i+1的结果时,我们发现,只需要把i位置的字符去掉,就可以知道是否满足......
  • (代码随想录)leetcode300. 最长递增子序列
    自己还是写不出来[笑哭]思路错了,自己死要去只遍历一遍代码随想录答案:classSolution{public:intlengthOfLIS(vector<int>&nums){if(nums.size()<=1)returnnums.size();vector<int>dp(nums.size(),1);//所有元素都是1长度//dp[i]......
  • 最长的递增子序列--动态规划、递归
    问题简述对于一个数组,计算其中最长的递增子序列的长度,并输出。主要思路如下:代码中提供了三种不同的实现方法:纯递归、递归+动态规划(记忆化),以及纯动态规划(迭代)。下面是每种方法的主要思路:1.纯递归实现(dp方法)这个方法尝试通过递归找到以每个元素结尾的最长递增子序列的长度......
  • 算法求解(C#)-- 寻找包含目标字符串的最短子串算法
    1.引言在字符串处理中,我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。2.问题描述给定一个源字符串source和一个目标字符串target,我们需要找......
  • LeetCode128 最长连续序列
    最长连续序列题目链接:LeetCode128描述给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它......
  • 无重复字符的最长子串
    题目给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。leetcode链接示例示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以......
  • 最长连续序列
    最长连续序列题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。思路......