查找两个字符串的最长公共子串

news2024/10/7 20:32:58

 

暴力解法

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
string a, b, minn = "";
// a和b是我们输入的
// minn存储的是我们最小的那个字符串

string cut(int l, int r) {
    string tmp = "";
    for (int i = l; i <= r; i++) tmp += a[i];
    return tmp;
}
// l代表的左端点,r代表的右端点,然后我们把这段的a截取出来 

void solve() {
    if (a.size() > b.size()) swap(a, b);
    // 我们让较短的那个字符串是a
    for (int i = 0; i < a.size(); i++) {
        // 这个让a的左端点从a的每一个位置开始枚举
        for (int j = i; j < a.size(); j++) {
            // 这个是枚举a字符串截取的右端点
            string tmp = cut(i, j);
            // 获取我们截取出来的字符串
            if (b.find(tmp) != string::npos) 
                if (tmp.size() > minn.size()) minn = tmp;
            // 如果b中有截取出来的这个字符串,那么我们就是会比较和我们之前
            // 保存的最长长度字符串比较,一样的不更新,因为要保证我们取到
            // 第一个最长的,然后大于的时候进行一个更新
        }
    }
    cout << minn << "\n";
    // 输出我们最小的那个字符串
}

signed main() {
    while(cin >> a >> b) {
        minn = "";
        //  因为多组输入,所以我们要进行这样一个清空的操作
        solve();
    }
    return 0;
}

 动态规划

思路:其实这个就是一个经典的DP问题,那我们最简单的思路其实就是我们可以开一个二维数组,那么我们这个二维数组是什么呢?假设我们定义了一个二维数组𝑑𝑝[𝑖][𝑗]dp[i][j],是什么意思呢?就是代表我们a字符串的前i个字符和b的前j的字符是一样的。

然后相同的地方设置为1,不同的地方设置为0,然后我们最后就是找最长的连续的对角线的长度就是最长的公共子串了

然后我们的状态转移方程就是:

#include <iostream>
using namespace std;

string substrMax(string a,string b)
{
   if(a.size()>b.size())
   {
    swap(a,b);
   }
   int len1=a.size();//这里其实用m,n来命名会更加方便
   int len2=b.size();
   int dp[len1+1][len2+1];//dp[i][j]表示a的前i个字符和b的前j个字符的最长公共子串长度
   int maxlen=0,end=0;
   for(int i=0;i<=len1;++i)dp[i][0]=0;
   for(int j=0;j<=len2;++j)dp[0][j]=0;
   for(int i=1;i<=len1;++i)
   {
    for(int j=1;j<=len2;++j)
    {
        if(a[i-1]==b[j-1])dp[i][j]=dp[i-1][j-1]+1;
        else dp[i][j]=0;
        if(dp[i][j]>maxlen)
        {
            maxlen=dp[i][j];
            end=i-1;
        }
    }
   }
   if(maxlen==0)return "-1";
   else return a.substr(end-maxlen+1,maxlen);
}
int main() {
    string a,b;
    cin>>a>>b;
    cout<<substrMax(a,b);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1618715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过商品id采集京东商品详情数据(含价格、优惠券、详情、主图等字段)

item_get_app-获得JD商品详情原数据 公共参数 名称类型必须描述keyString是调用key&#xff08;注册账号获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cach…

S32 Design Studio PE工具配置canCom

工具配置 基本就是默认配置就行&#xff0c;有需要的话就按照下面的方式改改。 生成代码 在Generated_Code/canCom1.c里面&#xff0c;对应刚才配置的信息。canCom1_InitConfig0是配置结构体&#xff0c;canCom1_State是初始化之后的状态结构体。 flexcan_state_t canCom1_S…

2024新算法角蜥优化算法(HLOA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验

简介&#xff1a; 2024新算法角蜥优化算法&#xff08;HLOA&#xff09;和经典灰狼优化器&#xff08;GWO&#xff09;进行无人机三维路径规划设计实验。 无人机三维路径规划的重要意义在于确保飞行安全、优化飞行路线以节省时间和能源消耗&#xff0c;并使无人机能够适应复杂…

iptables实现docker容器动态端口映射实操

背景 之前在《Docker 动态修改容器端口映射的方法》一文中&#xff0c;说明了如何使用修改配置和加防火墙规则实现动态端口映射。但是没有具体分享加防火墙实现动态端口映射的实际案例。今天就分享一下实际操作案例&#xff0c;供大家参考。 分析 动态端口映射的用途 容器端口…

stm32-中断的使用和原理

一 什么是中断 : 轮询机制 &#xff1a;顾名思义&#xff0c;就是每轮都询问一次。比如 while 循环的每一次&#xff0c;就会执 行检查&#xff0c; 1. 此处串口是否有数据到来。 2. 每次都检测一下引脚状态 , 是否为低电 平。 本质是 while 循环每一次都把数据获取的函数或者…

AI-数学-高中-40法向量求法

原作者视频&#xff1a;【空间向量】【考点精华】3法向量求法稳固&#xff08;基础&#xff09;_哔哩哔哩_bilibili 注意&#xff1a;法向量对长度没有限制&#xff0c;求法向量时&#xff0c;可以假设法向量z为任意一个取非0的值。 示例1&#xff1a; 示例2&#xff1a;

Golang | Leetcode Golang题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; func firstMissingPositive(nums []int) int {n : len(nums)for i : 0; i < n; i {for nums[i] > 0 && nums[i] < n && nums[nums[i]-1] ! nums[i] {nums[nums[i]-1], nums[i] nums[i], nums[nums[i]-1]}}for i …

含纽扣电池产品出口美国UL4200A:2023标准

该标准已于2023年10月23日正式生效&#xff0c;而16 CFR 1263也于同日生效。美国消费品安全委员会&#xff08;CPSC&#xff09;将给予从2023年9月21日至2024年3月19日的180天执法过渡期&#xff0c;而16 CFR 1263法案的强制执行日期为2024年3月19日。这意味着制造商和销售商有…

第26天:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

第二十六天 一、PHP新闻显示-数据库操作读取显示 1.新闻列表 数据库创建新闻存储代码连接数据库读取页面进行自定义显示 二、PHP模版引用-自写模版&Smarty渲染 1.自写模版引用 页面显示样式编排显示数据插入页面引用模版调用触发 2.Smarty模版引用 1.下载&#xff1a…

【Linux高性能服务器编程】两种高性能并发模式剖析——半同步/半异步模式

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之两种高性能并发模式介绍&#xff0c;在这篇文章中&#xff0c;你将会学习到高效的创建自己的高性能服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家来理解…

PHP-001、PHP学习之PhpStorm+PhpStudy环境安装

一、说明 由于当前需要&#xff0c;暂时停止学习python&#xff0c;当然有时间继续&#xff0c;转为php&#xff0c;听说php开发网站、小程序等运行效率更高&#xff0c;朋友那边再做这个&#xff0c;准备学习一下&#xff0c;和朋友们一起来吧&#xff0c;就这开发环境安装&a…

李沐60_机器翻译数据集——自学笔记

!pip install d2limport os import torch from d2l import torch as d2l下载和预处理数据集 在这个将英语翻译成法语的机器翻译问题中&#xff0c; 英语是源语言&#xff08;source language&#xff09;&#xff0c; 法语是目标语言&#xff08;target language&#xff09;。…

求职招聘小程序源码系统 全开源源代码:找工作+招人才功能强大 带完整的安装代码包以及搭建教程

互联网的深入发展&#xff0c;求职招聘已经不再是传统的线下模式所能满足的。越来越多的企业和求职者开始倾向于线上招聘&#xff0c;寻找更加便捷、高效的求职招聘方式。因此&#xff0c;我们结合市场需求和技术发展趋势&#xff0c;推出了这款求职招聘小程序源码系统。 该系…

VNISEdit 制作安装包

1. 环境依赖 1.1. NSIS 下载 下载地址&#xff1a;https://nsis.sourceforge.io/Download 1.2. VNISEdit 下载 下载地址1&#xff1a;https://sourceforge.net/projects/hmne/ 下载 exe 安装。 下载地址2&#xff1a;https://hmne.sourceforge.net/ 可以下载 exe 安装。也…

OurBMC大咖说|第4期:基于飞腾腾珑E2000的国产化BMC固件开发简介

栏目介绍&#xff1a;"OurBMC大咖说" 是由 OurBMC 社区精心策划的线上讲座栏目&#xff0c;邀请 BMC 相关领域大咖共同探讨 BMC 全栈技术的发展趋势、挑战和机遇。无论你是初学者还是资深从业者&#xff0c;"OurBMC大咖说" 都将为你提供一个宝贵的学习和交…

如何确定IP地址的地理位置

IP地址的地理位置确定是一个复杂而精细的过程&#xff0c;它结合了多种技术与方法来推断或确定设备在网络中的大致物理位置。以下是对IP地址地理位置确定过程的详细解释&#xff1a; 首先&#xff0c;我们要理解IP地址本身并不能直接反映物理位置信息。IP地址主要是用于在网络中…

路由引入,过滤实验

实验拓补图 实验目的&#xff1a; 1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 loopback口模拟业务网段 2、R1 和 R2 运行 RIPv2,R2&#xff0c;R3和R4运行 OSPF&#xff0c;各自协议内部互通 3、在 RIP 和 oSPF 间配置双向路由引入,要求除 R4 上的…

计算机java项目|springboot档案管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

工业级扫描式避障型激光雷达选型指南

工业级扫描式激光避障型传感器选型指南 在工业自动化领域&#xff0c;扫描式激光避障型传感器已成为不可或缺的关键组件。其高精度、高可靠性以及快速响应能力&#xff0c;使得机器人在复杂环境中能够安全、高效地执行任务。然而&#xff0c;面对市场上众多的传感器产品&#…

【S32DS RTD实战】-1.5-S32DS使用Post-Build调用第三方插件-自动对生成的s19,Hex,Bin文件二次编辑

<--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景&#xff1a; 在《【S32DS RTD实战】-1.3-S32K3工程生成S19&#xff0c;BIN&#xff0c;Hex文件&#xff0c;以及Post-build steps的妙用_s32ds如何生成s19或hex文件-CSDN博客https://blog.csdn.net/qfmzhu/articl…