最长公共子序列问题解析
问题解读
最长公共子序列问题,就是找出两个字符串中,存在的最长的
子序列
什么是子序列呢? 子序列不同于公共子串,子串是每个字符连续的,子序列不一定要连续,见下例 [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
最长公共子序列问题解析相关推荐
- Spell 基于最长公共子序列的在线日志解析方法
文章目录 01 日志模板挖掘 02 基于 LCS 的日志解析流程 2.1 日志键匹配查找 2.2 拆分与合并处理 2.2.1 拆分过程 2.2.2 合并过程 03 匹配查找优化 3.1 前缀树预过滤 ...
- LCS最长公共子序列和LIS最长上升子序列——例题剖析
一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...
- java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现
关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...
- 最长公共子序列问题LCS
最长公共子序列问题LCS 问题描写叙述: 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说.若给定序列X= { x1, x2,-, xm},则还有一序列Z= {z1, z2,-, z ...
- java最长公共子序列_技术分享 | 最长公共子序列在比对工具的应用
即使如何1 在实际工作中,我们常常要对输出的文本和数据进行比对:以取证大师为例,取证大师导出的取证结果数据量很容易达到上万条.这类数据特点除了数量级大外,其实数据结构很相近.即使我们以无以伦比的细致和 ...
- 最长公共子序列(C语言)
任务描述 本关任务:编写一个求最长公共子序列的程序. 相关知识 两个序列A[m]=(a1,...,am),B[n]=(b1,b2,...,bn),它的公共子序列是C[k]=(c1,..., ...
- 最长公共子序列Python解法
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符 ...
- 用动态规划解决最长公共子序列
要求:最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S ...
- longest-common-prefix[最长公共子序列]
题目描述 Write a function to find the longest common prefix string amongst an array of strings. 思路 求最长公共 ...
- 经典算法题——最长公共子序列
** 解析: ** 此题一共有两个要点: 1.求上述两个最长公共子序列的长度 2.求所有可能出现的最长公共子序列个数,答案可能很大,只要将答案对10^8求余即可 第一个都很好想到,难点在于第二个.下面 ...
最新文章
- linux c glob使用(文件路径模式查找函数)
- python输入输出-python输入与输出
- 研发流程与项目管理之关系
- 专家周 |360精确搜索VS今日头条精准推荐算法
- 前端学习(2376):项目初始化
- c js php比较字符串,Php 比较字符串相像度
- couchbase java 手册_couchbase的使用 java
- Python 爬虫工具 —— fake_useragent
- Javaparser使用
- 计算机显示器出现黑屏分析
- 计算机连接不上网络交换机,解决某些计算机在连接到路由器(交换机)后无法访问互联网的问题...
- Python之集合(综合练习)
- 计算机考试多少个小时,考驾照科一电脑刷几个小时
- python tkinter学习6 scale滑条
- 一个技术出身的市场人的小访谈
- 成都java培训班要多少钱
- 腾讯视频VIP周卡深圳地区免费领!附非深圳免费领腾讯视频会员攻略
- JS 删除Object中属性
- 纯函数,副函数具体例子
- 虚拟机安装MySQL