题目:题目链接
官方题解
强烈建议官方题解,通俗易懂,别看我的了,真不建议
题目大意:LCS(subsequence):求两个字符串text1,text2的最长公共子序列(注意是序列,不是字串,可以不连续)

思路:不多说,直接dp。因为肯定需要保存两个字符串的长度,所以肯定是二维的dp。我们想想LCS的子问题是啥,就是长度为i和j的字符串的LCS吧(其中i,j分别小于两个字符串的长度)
那么我们令dp[i][j]是长度为i的text1子串(即text1[0->i)这个子串),以及长度为j的text2子串(即text2[0->j)这个子串),两者的LCS的长度,则状态转移方程如下:

看代码吧:

class Solution {public:int longestCommonSubsequence(string text1, string text2) {int l1 = text1.size(), l2 = text2.size();vector<vector<int> > dp(l1 + 1, vector<int>(l2 + 1, 0));for (int i = 1; i <= l1; ++i) {for (int j = 1; j <= l2; ++j) {if (text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}return dp[l1][l2];}
};

还有个方法,不过代码挺长的,就是把dp[i][j]看成以text1[i],text2[j]结尾的两个字符串的LCS长度,也是大同小异,只是要根据i=0,j=0进行特判,因为这时候的dp[i][j]并不都是0,例如,text1=“abc”,text2=“aef”,那么dp[0][0]=1。特判情况,可以根据代码理解,还是推荐官方的,通俗易懂。
看代码吧:

class Solution {public:int longestCommonSubsequence(string text1, string text2) {int l1 = text1.size(), l2 = text2.size();vector<vector<int> > dp(l1 + 1, vector<int>(l2 + 1, 0));for (int i = 0; i < l1; ++i) {for (int j = 0; j < l2; ++j) {if (i>0&&j>0){if (text1[i] == text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}else if(i==0&&j>0 ){if(text1[i] == text2[j]) dp[i][j] = 1;else dp[i][j] = dp[i][j-1];}else if(j==0&&i>0){if(text1[i] == text2[j]) dp[i][j] = 1;else dp[i][j] = dp[i-1][j];}else dp[i][j] = (text1[i]==text2[j]);}}return dp[l1-1][l2-1];}
};

以上。

leetcode1143. Longest Common Subsequence相关推荐

  1. C++longest common subsequence最长公共子序列的实现(附完整源码)

    C++longest common subsequence最长公共子序列 longest common subsequence最长公共子序列的完整源码(定义,实现,main函数测试) longest ...

  2. 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)...

    2019独角兽企业重金招聘Python工程师标准>>> 问题描述:序列X={x1,x2,-,xn},Y={y1,y2,-,yn},当Z={z1,z2-,zn}是X的严格递增下标顺序( ...

  3. UVA10405 Longest Common Subsequence【LCS+DP】

    Given two sequences of characters, print the length of the longest common subsequence of both sequen ...

  4. 最长公共子串LCS (Longest Common Subsequence) 算法

    三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正.同时有新的想法,也可以提出! 采用顺序结构存储串, ...

  5. LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)

    LeetCode--1143. 最长公共子序列[Longest Common Subsequence][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代 ...

  6. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  7. UVA 10405 - Longest Common Subsequence

    本题是求最长公共子序列,题目也给了提示,是求最长公共子序列最基本的题. 注意字符串的读取要用gets()而不用scanf()因为字符串里可能有空格. 代码如下: #include<stdio.h ...

  8. leetcode 1143. Longest Common Subsequence | 1143. 最长公共子序列(动态规划,暴力递归->傻缓存->dp)

    题目 https://leetcode.com/problems/longest-common-subsequence/ 题解 经典的 暴力递归 -> 傻缓存 -> dp 题目,以 &qu ...

  9. [Codewar训练]Longest Common Subsequence(Performance version)(最长子序)

    问题: 段位:4 说明: 查找两个字符串之间,按照顺序匹配出最长的一个字符串出来,匹配时候按照各个字符相对位置顺序,不用连续,然后返回匹配出来的字符串,相同长度的返回任意一个就行. 输入案例: // ...

最新文章

  1. java亲密数的解题思路,算法解题思路总结 - jjhgx的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 关于Python中的self
  3. 嵌入式控制系统和计算机系统
  4. ModelCoder国产化解决方案已逐步代替国外软件Matlab/Simulink
  5. 小议如何跳出魔改网络结构的火坑
  6. Kali Linux 无线渗透测试入门指南 第一章 配置无线环境
  7. android activity 窗口 样式
  8. 解决Discuz安装时报错“该函数需要 php.ini 中 allow_url_fopen 选项开启…”
  9. .NET之对接口和抽象类(二)
  10. linux读usb转ttl串口数据,ubuntu16.04使用USB转TTL(ch340)串口转usb调试过程
  11. 3分钟全面了解元数据和数据元
  12. Excel如何从一组数据中随机抽取若干个数据
  13. 目标跟踪论文整理(不全,以单目标为主)
  14. mysql省市联动_sql全国 省市 联动级联
  15. 记录第一次使用python模拟鼠标点击
  16. python练习题——十大歌手
  17. 世界上最有名的十大思想实验
  18. 163企业邮箱申请,163企业邮箱注册方法
  19. Android-Q显示白平衡
  20. 上海车艺尚教你如何DIY原厂8.8寸大屏幕----宝马车友必看

热门文章

  1. C 工程师校招面试考点基础篇汇总含答案解析
  2. SpringCloud Gateway——请求转发源码分析
  3. SpringCloud学习(六)----- Gatewayw网关完善(防止SQL注入)
  4. 这份日志格式规范超棒的,拿走不谢(Java版)
  5. 程序员工作不稳定?你以为的稳定工作,其实都是高风险职业
  6. URLEncoder 空格编码问题
  7. Ubuntu下安装suricata
  8. centos7如何把虚拟网卡名称ifcfg-eno16777736改成ifcfg-eth0(无法重启网卡的终极解决方案)
  9. 简述windows环境下的homestead安装
  10. R语言(五)——横截面数据分类:经典方法(logistic、probit、判别分析)