子序列与子串问题总结

1、最长递增子序列

扩展:双端LIS

题目:从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。

该题是网易游戏的笔试题,是一个典型的LIS变形,思路就是利用LIS计算两个数组B,C。其中B[i]表示从左向右以i结尾的最长递增子序列,C[i]表示从右向左n~i的最长递增子序列,即i~n的最长递减子序列,所以以data[i]作为最高点需要去掉的数字为n-B[i]-C[i]+1,具体代码如下:

#include<iostream>
#include<vector>
using namespace std;

int DoubleEndLIS(vector<int> data)//当然也可以使用O(nlogn)的算法
{
	int length = data.size(),i,j,res = length;
	if(length == 0)return 0;
	vector<int> B(length,1),C(length,1);
	for(i = 0;i < length;++i)//从左向右
	{
		for(j = 0;j < i;++j)
		{
			if(data[j] < data[i] && B[j]+1 > B[i])B[i] = B[j]+1;
		}
	}
	for(i = length-1;i >= 0;--i)//从右向左
	{
		for(j = length-1;j > i;--j)
		{
			if(data[j] < data[i] && C[j]+1 > C[i])C[i] = C[j]+1;
		}
	}
	for(i = 0;i < length;++i)
	{
		if(length - B[i] - C[i] + 1 < res)res = length - B[i] - C[i] + 1;
	}
	return res;
}

int main()
{
	int n,i;
	while(cin >> n)
	{
		vector<int> data(n);
		for(i=0;i < n;++i)cin >> data[i];
		cout << DoubleEndLIS(data) << endl;
	}
}

2、最长公共子序列

3、最长公共子串

4、最长公共前缀

5、最长公共祖先

6、最长重复子串(可重叠)

7、最长不重复子串

子序列与子串问题总结

时间: 2024-10-20 03:24:46

子序列与子串问题总结的相关文章

c++求两个字符串的最长公共子序列and子串

https://blog.csdn.net/ggdhs/article/details/90713154 #include <iostream> using namespace std; int main() { char str1[] = "helloworld"; char str2[] = "loop"; int arr[11][5] = {0}; for(uint32_t i=1; i<11;i++) { cout << str

序列最的问题之最长公共子序列LCS

在程序设计竞赛中,我们时常会遇到序列求最值的问题.在讲今天的问题之前,先小小的说明一下,子序列与子串的问题. 子序列:在原序列中不一定连续: 子串:在原序列中必须连续. 接下来,就开始今天要讲的最长公共子序列LCS(Longest Common Subsequence).对于LCS这一类的问题,一般是相对于两个序列而言,str[]与ch[].先假设str的长度为n,ch的长度为m.假设str[]="ASBDAH",ch[]="SDAAH";其中"SDA&q

面试:字符串字典序最大的子序列

字符串字典序最大的子序列 首先要知道什么是字典序,顾名思义,就是字典上的顺序.两个字符串进行对比时, 一位一位的按照a, b, c等字典序比较,如果相同就顺位比较下一位,比如ba比ab大,如果哪一位已经不一样 就已经比较出来结果了,如果是abc, abcd这样的情况,长度长的大. 子序列和子串的区别:这俩其实不一样,子串是连续的,比如字符串abcdef,它的子串是abc,abcd等这些连续的.而子序列是不连续的.比如ace这样的. 最简单的想法,先遍历一遍,找到最大的一个字符,以及他的位置,然后

LCS问题

LCS问题即longest common subsequence problem,中文:最长公共子序列问题 给你两个字符串str1和str2,它们之间可能存在公有子序列,子序列和子串的区别是:子序列不要求连续,只需要按照顺序出现就好,子串则要求连续: 例如:SIMPLE和NAIVE有共同的子序列IE,但是没有共同的子串. TOO SIMPLE和TOO YOUNG则有共同子串TOO LCS问题就是(1)求出最长公有子序列的长度(2)求出最长公有子序列. (1) 求出最长公有子序列的长度 解法考虑动

POJ 1159 Palindrome 题解

本题的题意理解之后,就是求最长回文子序列 longest palindrome subsequence,这里注意子序列和子串的区别. 有两种求法,一种是直接求,相当于填矩阵右上对角阵,另一种是转化为longest common subsequence的求法. 最大难点就是要求内存不能使用二维的. 故此第一种方法是有点难度的,因为需要把二维矩阵的对角线转化为一维表记录,对好下标就好了. 第二中方法会稍微容易点,效率都是一样的O(n*n). 方法1: #include <cstdio> const

·DP」知识点整理

一.最长公共子序列(LCS Longest Common  Subsequence) 第一,先说区别,最长公共子串和最长公共子序列是不一样的. 最长公共子串不许是连续的,而最长公共子序列可以是不联系的. 网络上解释的子序列: 一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列.最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的. 例如 X=ABCBDAB Y=BDCABA BCA是X和Y的一个公共子序列,但是不是X和Y的最长公共子序列,

POJ 1238 Substrings

Problem Description: You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings. Input: The first line of the input

『LeetCode』练习第二弹

3. Longest Substring Without Repeating Characters Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", t

【bzoj2384】[Ceoi2011]Match 特殊匹配条件的KMP+树状数组

题目描述 给出两个长度分别为n.m的序列A.B,求出B的所有长度为n的连续子序列(子串),满足:序列中第i小的数在序列的Ai位置. 输入 第一行包含两个整数n, m (2≤n≤m≤1000000). 第二行包含n个整数si,构成1,2,…,n的排列,1≤si≤n且si≠sj. 第三行包含m个整数hi,表示建筑的高度(1≤hi≤109,1≤i≤m),所有的hi均不相同. 每一行的整数之间用单个空格隔开. 输出 第一行包含1个整数k ,表示匹配的序列数目.第二行包含k个整数,分别为在正确匹配的每个序