[算法] 字符串
来源:互联网 发布:王柳雯淘宝店 编辑:程序博客网 时间:2024/05/23 19:24
1. 最长公共子序列
子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串:
cnblogs
belong
比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列。最长公共子序列(Longest Common Subsequence, LCS),顾名思义,是指在所有的子序列中最长的那一个。子串是要求更严格的一种子序列,要求在母串中连续地出现。在上述例子的中,最长公共子序列为blog(cnblogs, belong),最长公共子串为lo(cnblogs, belong)
思路分析:
考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bn-1”,并Z=“z0,z1,…,zk-1”为它们的最长公共子序列。不难证明有以下性质:
(1) 如果am-1==bn-1,则zk-1=am-1=bn-1,且“z0,z1,…,zk-2”是“a0,a1,…,am-2”和“b0,b1,…,bn-2”的一个最长公共子序列;
(2)如果am-1!=bn-1,则若zk-1!=am-1时,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列;
(3)如果am-1!=bn-1,则若zk-1!=bn-1时,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列。
代码如下:
输出子序列:
2. 最长公共子串
代码如下:
输出子串:
3.最长非降子序列
思路: (复杂度 nlog n)
开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将temp入栈;如果temp < top则二分查找栈中的比temp大的第1个数,并用temp替换它。 最长序列长度即为栈的大小top。
这也是很好理解的,对于x和y,如果x < y且Stack[y] < Stack[x],用Stack[x]替换Stack[y],此时的最长序列长度没有改变但序列Q的”潜力”增大了。
举例:原序列为1,5,8,3,6,7
栈为1,5,8,此时读到3,用3替换5,得到1,3,8; 再读6,用6替换8,得到1,3,6;再读7,得到最终栈为1,3,6,7。最长递增子序列为长度4。
代码如下:
- 字符串算法
- 字符串算法
- 字符串算法
- 字符串算法
- 【算法】字符串
- [算法] 字符串
- 算法-字符串
- 字符串 [BF算法] --->字符串
- 字符串算法manacher算法
- 算法 字符串匹配算法
- 字符串---字符串匹配KMP算法
- 【字符串】KMP字符串匹配算法
- 字符串算法之kmp算法
- 字符串算法之sunday算法
- KMP算法 字符串匹配算法
- BM算法 字符串匹配算法
- KMP算法/字符串匹配算法
- 字符串查找算法:bm算法
- Windows的文件系统
- 最通俗易懂的01背包问题讲解
- java迷你DVD管理器源代码
- Could not resolve type alias 微服务启动时的报错
- JavaScript简单综合总结
- [算法] 字符串
- 1294 全排列
- AOP和fifter(OOP)的区别和联系
- 算法入门经典二叉树DFS题目UVA548 Tree
- web实现电脑屏幕和手机屏幕适应
- 进程和线程(二)
- 深入浅出解释FFT(五)——FFT结果的物理意义
- Maven instal Could not resolve dependencies for project 找不到本地仓库下的jar
- CF