力扣1143. 最长公共子序列(动态规划)

news2024/9/22 21:17:35

Problem: 1143. 最长公共子序列

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述

思路

我们先假设已经将两个字符串转换为两个char类型的数组(t1,t2)便于比较

1.如果t1[i] == t2[j],有三种决策:(i+1,j+1),(i+1, j), (i, j+1); (i,j表示当前待比较的字符;"i+1"即表示指向t1数组中的一字符的下一个)
如果t1[i] != t2[j],有三种决策:(i+1,j+1),(i+1, j), (i, j+1);
2.达到(i,j)这个状态,也就是说:开始匹配t1[i]和t2[j]了,只可能从上一个阶段的这几个阶段转移过来:(i-1, j),(i, j-1), (i - 1, j - 1);

如果状态时(i-1,j),那么i+1,j不变,则得到(i,j)这个状态;
如果状态时(i,j-1),那么i不变,j+1,则得到(i,j)这个状态;
如果状态时(i-1,j-1),那么i+1,j+1,则得到(i,j)这个状态;

3.int dp[n + 1][m + 1];(其中n表示字符串text1的长度,m表示字符串text2的长度);

dp[i][j]表示长度为i的text1的子串和长度为j的text2的子串的最长公共子序列的长度

4.状态转移方程:如果t1[i - 1] == t2[j - 1]则dp[i][j] = max(dp[i - 1][j - 1] + 1, dp[i - 1][j], dp[i][j - 1]);即表示若当前上一个位置的字符相等则其对应的状态存储的最长公共子序列加一(dp[i - 1][j - 1] + 1);如果t1[i - 1] != t2[j - 1]则dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]);

解题方法

1.获取字符串text1和text2的长度text1Len和text2Len,并创建为对应的char类型数组t1和t2;生成二维数组dp:vector<vector> dp(text1Len + 1, vector(text2Len + 1));
2.初始化dp数组的第0行与第0列为0;
3.编写返回给定三个数中最大值的函数
4.从第一行开始执行动态转移方程
5.返回dp[text1Len][text2Len]

复杂度

时间复杂度:

O ( N M ) O(NM) O(NM);其中 N N N为字符产text1的长度, M M M为字符串text2的长度

空间复杂度:

O ( N M ) O(NM) O(NM)

Code

class Solution {
public:
    /**
     * Find the longest common subsequence
     * @param text1 Given string
     * @param text2 Given string
     * @return int
     */
    int longestCommonSubsequence(string text1, string text2) {
        int text1Len = text1.length();
        int text2Len = text2.length();
        char *t1 = new char[text1Len + 1];
        char *t2 = new char[text2Len + 1];

        strcpy(t1, text1.c_str());
        strcpy(t2, text2.c_str());
        //dp[i][j] represents the LCS of
        // text1[0-i-1](substring of length i)
        // and text2[0-j-1](substring of length j)
        vector<vector<int>> dp(text1Len + 1, vector<int>(text2Len + 1));
        for (int j = 0; j <= text2Len; ++j) {
            dp[0][j] = 0;
        }
        for (int i = 0; i <= text1Len; ++i) {
            dp[i][0] = 0;
        }

        for (int i = 1; i <= text1Len; ++i) {
            for (int j = 1; j <= text2Len; ++j) {
                if (t1[i - 1] == t2[j - 1]) {
                    dp[i][j] = max3(dp[i - 1][j - 1] + 1, dp[i - 1][j], dp[i][j - 1]);
                } else {
                    dp[i][j] = max3(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[text1Len][text2Len];
    }

private:
    /**
     *Find the largest of the three numbers
     * @param a Figure to be compared
     * @param b Figure to be compared
     * @param c Figure to be compared
     * @return int
     */
    int max3(int a, int b, int c) {
        int maxVal = a;
        if (maxVal < b) {
            maxVal = b;
        }
        if (maxVal < c) {
            maxVal = c;
        }
        return maxVal;
    }
};

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

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

相关文章

第二篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像处理

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列 博文目录一、项目目标二、第一个示例代码三、第二个示例代码四、第三个示例代码五、第四个示例代码六、第五个示例代码七、知识点归纳总结 系列短博文目录 Python的OpenCV库技术点案例示例短博文…

初识k8s(概述、原理、安装)

文章目录 概述由来主要功能 K8S架构架构图组件说明ClusterMasterNodekubectl 组件处理流程 K8S概念组成PodPod控制器ReplicationController&#xff08;副本控制器&#xff09;ReplicaSet &#xff08;副本集&#xff09;DeploymentStatefulSet &#xff08;有状态副本集&#…

docker配置node项目

首先在项目根目录创建Dockerfile FROM node:18.19RUN mkdir /appCOPY . /appWORKDIR /appRUN npm installEXPOSE 8081CMD ["npm","run","start"]添加.dockerignore文件 /dist /node_moduleslogs *.log npm-debug.log* yarn-debug.log* yarn-er…

Linux中如何根据一个单词快速锁定到日志

Linux中如何根据一个单词快速锁定到日志 记住&#xff0c;人生的价值不在于终点的远近&#xff0c;而在于沿途的风景和历经的风雨。每一步都是成长&#xff0c;每一刻都是奇迹。保持一颗热情奔放的心&#xff0c;勇敢地迎接生活的挑战&#xff0c;你将会发现&#xff0c;每一天…

ppt流程图模板怎么绘制?手把手教你绘制PPT流程图

ppt流程图模板怎么绘制&#xff1f;在工作中&#xff0c;演示文稿中的流程图往往能够清晰地展示项目的流程和逻辑&#xff0c;使观众更好地理解内容。但是&#xff0c;很多人在制作PPT时&#xff0c;可能会对如何绘制流程图感到困惑。今天&#xff0c;就给大家手把手教一下如何…

基于springboot+vue的网上点餐系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景和意…

JavaEE 网络原理

JavaEE 网络原理 文章目录 JavaEE 网络原理1. 网络互连1.1 局域网LAN1.2 广域网WAN 2. 网络通信基础2.1 IP地址2.2 端口号 3. 网络协议3.1 概念3.2 五元组3.3 协议分层3.4 TCP/IP 五层模型3.5 封装和分用 1. 网络互连 随着时代的发展&#xff0c;需要多个计算机协同工作来完成…

中仕教育:选调生和考研可以一起准备吗?

研究生入学考试&#xff0c;是本科生们提升学历继续深造的主要途径。而选调生&#xff0c;是指通过考试选拔的优秀应届毕业生&#xff0c;经过锻炼后分配到各级工作。这两者作为大部分人选择的方向&#xff0c;发展前景都是比较好的。 考研和选调生可以一起准备吗? 是可以的…

8. UE5 RPG创建UI(上)

UI是显示角色的一部分属性玩家可以直接查看的界面&#xff0c;通过直观的形式在屏幕上显示角色的各种信息。如何使用一种可扩展&#xff0c;可维护的形式来制作&#xff0c;这不得不说到耳熟能详的MVC架构。 MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件…

计算机网络-AAA原理概述

对于任何网络&#xff0c;用户管理都是最基本的安全管理要求之一&#xff0c;在华为设备管理中通过AAA框架进行认证、授权、计费实现安全验证。 一、AAA概述 AAA&#xff08;Authentication(认证), Authorization(授权), and Accounting(计费)&#xff09;是一种管理框架&#…

vue3-组件基础

什么是组件 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行处理。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构。 定义一个组件 我们一般会将 Vue 组件定义在一个单独的 .vue 文件中&#xff0c;这被叫做单文件组件 (简称…

Leetcode刷题笔记题解(C++):670. 最大交换

思路&#xff1a; 假设数字 9923676 从右边找最大的数字的下标maxindex&#xff0c;然后向左边寻找小于最大数字的数的下标&#xff0c;直到找到最左边&#xff0c;交换两者得出新的数字&#xff0c;比如从左到右递减的数字如9621则不需要变化&#xff0c;在寻找中记录这种数…

最长子字符串的长度(二) - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 给你一个字符串 s&#xff0c;字符串s首尾相连成一个环形 &#xff0c;请你在环中找出’l’、‘o’、‘x’ 字符都恰好出现了偶数次最长子字符串的长度。 输入描…

【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现&#xff1a; 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析 代码实现&#xff1a; 一、冒泡排序 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大…

前端JavaScript篇之实现有序数组原地去重方法有哪些?

目录 实现有序数组原地去重方法有哪些&#xff1f;方法一&#xff1a;使用 Set 数据结构代码实现&#xff1a;思路说明&#xff1a; 方法二&#xff1a;使用双指针遍历代码实现&#xff1a;思路说明&#xff1a; 实现有序数组原地去重方法有哪些&#xff1f; 在 JavaScript 中…

Dockerfile-xxxx

1、Dockerfile-server FROM openjdk:8-jdk-alpine WORKDIR /app COPY . . CMD java -Xms1536M -Xmx1536M -XX:UseG1GC -jar -Dlog4j2.formatMsgNoLookupstrue -Dloader.pathresources,lib -Duser.timezoneGMT-05 /app/server-main-1.0.0.jar 2、Dockerfile-bgd #FROM openjdk…

(笔记总结)C/C++语言的常用库函数(持续记录,积累量变)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

代码+视频R语言绘制逆概率加权后的基线表

基于 PS &#xff08;倾向评分&#xff09;的逆概率加权(IPTW )法首先由&#xff32;osenbaum作为一种以模型为基础的直接标准化法提出&#xff0c;属于边际结构模型。简单来说&#xff0c;就是把许多协变量和混杂因素打包成一个概率并进行加权&#xff0c;这样的话&#xff0c…

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心&#xff0c;Kotlin 在 Android双击图片放大移动图中双击点到ImageView区域中心&#xff0c;Kotlin-CSDN博客 基础上&#xff0c;这次使用ScaleGestureDetector检测两根手指的缩放动作&a…

开源人工智能AI壁纸生成器--AI Wallpaper Generator

AI Wallpaper Generator AI Wallpaper Generator&#xff1a;AI Wallpaper Generator | AI Wallpaper Shop GitHub地址&#xff1a;https://github.com/all-in-aigc/aiwallpaper 一款开源人工智能AI壁纸生成器&#xff0c;根据用户的输入提示词&#xff0c;即可生成对应的高…