问题解读


最长公共子序列问题,就是找出两个字符串中,存在的最长的子序列

什么是子序列呢? 子序列不同于公共子串,子串是每个字符连续的,子序列不一定要连续,见下例 [example]

[example]: 比如 mStringA = "abc11google11111111", mStringB = "1111111141615" 这两个字符串 那么,mStringA 和 mStringB 的最长公共子序列就是 1111111111


如何求解

我们对于问题进行白话讲解,假如现在有两个字符串,并且有两个指针,这每个指针,各自指向这两个字符串,我们把这两个指针设置为 i 和 j,即,i 指向 mStringA 的某个字符,j 指向 mStringB 的某个字符,那么,此时的状态方程为 f(i, j),表示 i 指向 mStringA 的某个字符和 j 指向 mStringB 的某个字符的情况

  • 当两个指针指向的字符相等时,那么代表这是一个成功的状态,此时,状态记为f(i + 1, j + 1) + 1,表示 i 和 j 两个指针可以同时向右方移动
  • 当两个指针指向的字符不相等的试试,那么代表这是一个待完成的状态,此时,状态记为 f(i + 1, j)f(i, j + 1)

Talk is cheap, show me code ~~~

package com.company;import org.junit.Test;public class LongestCommonSequence {// 用来存储匹配过程中存取的记录public StringBuilder sb = new StringBuilder();/* * 获得最长公共子序列的方法* 传入两个参数,即为需要处理的字符串* 核心实现方法在 longestCommonSequence(...)*/public String getLongestCommonSequence(String mStringA, String mStringB) {// 1. 拿到最长公共子序列的长度int strLength = longestCommonSequence(0, mStringA, 0, mStringB);// 2. 将 StringBuilder 转为 String 类String mString = new String(sb);// 3. 对记录进行裁剪,最后的 strLength 个字符,是最终的结果return mString.substring(strLength - longestCommonSequence(0, mStringA, 0, mStringB),strLength);}// 最长公共子序列的实现方法public int longestCommonSequence(int i, String mStringA, int j, String mStringB) {// 1. 边界条件判断,当指针到头的时候,返回 0if (i == mStringA.length() || j == mStringB.length()) {return 0;}// 2. 当两个指针指向的字符相等的时候,这是状态方程为:f(i + 1, j + 1) + 1if (mStringA.charAt(i) == mStringB.charAt(j)) {sb.append(mStringA.charAt(i));return longestCommonSequence(i + 1, mStringA, j + 1, mStringB) + 1;} else { // 3. 当两个指针指向的字符不相等的时候,这是状态方程为:f(i + 1, j) 或者 f(i, j + 1)return Math.max(longestCommonSequence(i + 1, mStringA, j, mStringB),longestCommonSequence(i, mStringA, j + 1, mStringB));}}// 测试方法@Testpublic void test() {// 1111111111System.out.println(getLongestCommonSequence("abc11google11111111","1111111141615"));}
}复制代码

end

最长公共子序列问题解析相关推荐

  1. Spell 基于最长公共子序列的在线日志解析方法

    文章目录 01 日志模板挖掘 02 基于 LCS 的日志解析流程 2.1 日志键匹配查找 2.2 拆分与合并处理 2.2.1 拆分过程 2.2.2 合并过程 03 匹配查找优化 3.1 前缀树预过滤 ...

  2. LCS最长公共子序列和LIS最长上升子序列——例题剖析

    一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...

  3. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

  4. 最长公共子序列问题LCS

    最长公共子序列问题LCS 问题描写叙述: 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说.若给定序列X= { x1, x2,-, xm},则还有一序列Z= {z1, z2,-, z ...

  5. java最长公共子序列_技术分享 | 最长公共子序列在比对工具的应用

    即使如何1 在实际工作中,我们常常要对输出的文本和数据进行比对:以取证大师为例,取证大师导出的取证结果数据量很容易达到上万条.这类数据特点除了数量级大外,其实数据结构很相近.即使我们以无以伦比的细致和 ...

  6. 最长公共子序列(C语言)

    任务描述 本关任务:编写一个求最长公共子序列的程序. 相关知识 两个序列A[m]=(a1​,...,am​),B[n]=(b1​,b2​,...,bn​),它的公共子序列是C[k]=(c1​,..., ...

  7. 最长公共子序列Python解法

    给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符 ...

  8. 用动态规划解决最长公共子序列

    要求:最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S ...

  9. longest-common-prefix[最长公共子序列]

    题目描述 Write a function to find the longest common prefix string amongst an array of strings. 思路 求最长公共 ...

  10. 经典算法题——最长公共子序列

    ** 解析: ** 此题一共有两个要点: 1.求上述两个最长公共子序列的长度 2.求所有可能出现的最长公共子序列个数,答案可能很大,只要将答案对10^8求余即可 第一个都很好想到,难点在于第二个.下面 ...

最新文章

  1. linux c glob使用(文件路径模式查找函数)
  2. python输入输出-python输入与输出
  3. 研发流程与项目管理之关系
  4. 专家周 |360精确搜索VS今日头条精准推荐算法
  5. 前端学习(2376):项目初始化
  6. c js php比较字符串,Php 比较字符串相像度
  7. couchbase java 手册_couchbase的使用 java
  8. Python 爬虫工具 —— fake_useragent
  9. Javaparser使用
  10. 计算机显示器出现黑屏分析
  11. 计算机连接不上网络交换机,解决某些计算机在连接到路由器(交换机)后无法访问互联网的问题...
  12. Python之集合(综合练习)
  13. 计算机考试多少个小时,考驾照科一电脑刷几个小时
  14. python tkinter学习6 scale滑条
  15. 一个技术出身的市场人的小访谈
  16. 成都java培训班要多少钱
  17. 腾讯视频VIP周卡深圳地区免费领!附非深圳免费领腾讯视频会员攻略
  18. JS 删除Object中属性
  19. 纯函数,副函数具体例子
  20. 虚拟机安装MySQL

热门文章

  1. 0918类对象重载,作业5
  2. 《Android面试宝典》学习笔记(第三章:组件)
  3. tomcat 6.0配置
  4. 搞笑又雷人的个人签名
  5. IIS出现server application error的解决办法
  6. Linux内核基础--事件通知链(notifier chain)
  7. Android-- bionic介绍
  8. 流媒体基本要点简述:如何在H264数据中获取PTS?
  9. ffmpeg(8) AVIOContext II
  10. read()/write()的生命旅程之三——第三章:write()