阿里笔试题:求两个子序列的最大连续子序列

原题例如以下:

给定一个query和一个text,均由小写字母组成。要求在text中找出以相同的顺序连续出如今query中的最长连续字母序列的长度。比如。query为 "acbac",text为"acaccbabb",那么text中的"cba"为最长的连续出如今query中的字母序列,因此。返回结果应该为其长度3。请注意程序效率。

解题方法一:

和字符串匹配一样(http://blog.csdn.net/sinat_24520925/article/details/45113651)。T字符串和P字符串,相当于在T字符串的每一个字符都求一个和P的最大连续子序列。代码例如以下:

int  sublength(string T,string P)
{
	string res="";
	int n=T.length();
	int m=P.length();
	string substring="";
	for(int i=0;i<n;i++)
	{
		substring="";
		for(int j=0;j<m;j++)
		{
			if((i+j)<=(n-1))
			{
				if(T[i+j]!=P[j])
				{
					if(substring.length()>res.length())
				   {
					res=substring;
					substring="";
				   }
				}
				else
					substring+=T[i+j];
			}
			else
			{
				if(substring.length()>res.length())
				   {
					res=substring;
					substring="";
					break;
				   }
			}
		}
	}
	return res.length();
}

解题思路二:

和求公共子序列同样(http://blog.csdn.net/sinat_24520925/article/details/42872251),仅仅只是子序列是连续的,我们用一个二维矩阵matrix就能够表示子序列的情况。T代表每一列的字符,P代表每一行的元素,假设P【i】=T【j】,则matrix【i】【j】=matrix【i-1】【j-1】+1。

最后输出矩阵中最大的元素就可以,要是求最大连续子序列。依据最大元素的位置。沿着对角线向上回溯就可得到答案。代码例如以下:

int  sublength1(string T,string P)
{
	int n=T.length();
	int m=P.length();
	vector<vector<int>> matrix;
	vector<int> row(n,0);
	for(int i=0;i<m;i++)
		matrix.push_back(row);
	int max=0;
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(T[j]==P[i])
			{
				if(i!=0&&j!=0)
				{
					matrix[i][j]=matrix[i-1][j-1]+1;
					if(matrix[i][j]>max)
						max=matrix[i][j];
				}
				else
				matrix[i][j]=1;
			}
		}
	}
	return max;
}
时间: 2024-10-13 10:21:06

阿里笔试题:求两个子序列的最大连续子序列的相关文章

阿里笔试题,乱序序列的保序输出。

按自己的思想简单写了一下,多多交流. #include "stdafx.h" int insertInOrder(int *a,int num,int len){//这个方法可以改进很多,插入数据,再进行排序. int position; if (a[0]==0) { a[0] = num; position = 1; } for (int i = 0; i < len-1;i++) { if (num>a[i] && num<a[i + 1]) {

阿里笔试题记录(Android客户端部分)

阿里笔试题记录(Android客户端部分) 选择题 结果应该是选择 80,8 思路: - 指针的值都是一个个地址,而地址是用无符号整型值来表示的,也就是unsigned int.因此一个指针类型变量的大小就是unsigned int类型的大小. - 64位系统,一个地址占用的二进制位数为64(8字节),32位系统,地址的二进制位数32(4字节).参考64位操作系统的指针不都是64位吗 32位cpu和64位cpu,这个位数指的是数据字长,而不是地址字长.两者没有必然的数值上的联系.处理器字长是指处

阿里笔试题(2015)持续更新中

第一次做阿里笔试题,除了ACM题之外从来没有做过校招网络题呀,完全是裸考,总体感觉吧,对于我来说,感觉时间不够用,不是题不会,感觉时间紧,大脑很混乱,总结这一次的笔试题 废话不多说,直接上题和答案 平均每个人逗留时间为20分钟,那么开场前20分钟一共来了400人,且有20个人逗留时间已经到,但他们不一定出去,注意是平均时间,所有博物馆最少应该容纳500人 双向循环列表,从任何一个元素开始可以遍历全部元素 先和后面的元素相连 s->next=p->next; p->next->pre

阿里笔试题-派生类构造函数 创建顺序

派生类 与基类的关系: (1)创建构造函数的顺序 :基类构造函数(注意此处基类的成员不能初始化) ==>派生类成员初始化 ==>派生类构造函数 (2)派生类的构造函数 中 基类的构造函数默认在第一条,如果不写super(),则默认在第一条,注意位置不能颠倒 (3)派生类可以继承全部的基类的构造函数 阿里笔试题 举个栗子: 1 package com.test; 2 3 public class DispatchTest { 4 5 public static void main(String[

HDU 6625 three arrays 求两个序列异或最小值的排列(一个可以推广的正解

目录 题意: 解析 原题描述 @(hdu 6625求两个序列异或最小值的排列) 题意: \(T(100)\)组,每组两个长度为\(n(100000)\)的排列,你可以将\(a[]\)和\(b[]\)随机排列,可以得到\(c[i]=a[i]\)^\(b[i]\),求字典序最小的\(c[]\). 解析 一个显然对的贪心做法: 针对本题 每次两颗字典树同时往下走,如果都有\(0\)或者\(1\)这条路径,就随便同时走\(0\;or\;1\)这条路径,否则只能一个走\(0\),一个走\(1\).这样复杂

又一份阿里笔试题

接踵而至的笔试啊...各种忙碌啊... 1,  假设把整数关键码K散列到有N个槽的散列表,以下哪些散列函数是好的散列函数() A.h(k)= K/N  B.h(k)=1  C.h(k) = k mod N D.h(k) = (K + random(N) ) mod N   ,random(N)返回一个0到N的整数 2,下面的排序算法中,初始化数据集的排练顺序对算法的性能无影响的是() A,堆排序  B,插入排序  C,冒泡排序  D,快速排序 3,下面说法错误的是() A,CISC计算机比RIS

【基础练习】【线性DP】codevs2622 数字序列(最大连续子序列和)题解

版权信息 转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看 这道题目本质就是朴素的最大连续子序列和 直接上题目和代码 题目描述 Description 给定一个长度为n的一个序列A1,A2,-,An,求序列中连续子序列的最大和. 例如:当输入为-5,3,5,7,-15,6,9,27,-36,10时,连续子序列6,9,27的和为42是最大值:而当序列变成-5,3,5,8,-15,6,9,27,-36,10时,连续子序列3,5,8,-15,6

阿里笔试题之Android网络优化

记得这是阿里校招笔试的一道问答题 答案是小伙伴们之后一起拼出来的,不乏有些飘忽的东西,需要的朋友可以做个参考(具体细节可以自行百度),欢迎提出更好的建议! 在客户端方面: 1.减少网络请求的数量,能够合并的网络请求尽量合并,尽量在一次查询中完成多个零散数据的查询 2.为网络数据做本地缓存处理 3.设置超时时间,数据压缩传送,比如从服务器端获取列表数据,如果可以最好是能将服务器端的流压缩一下,接收压缩流,这样速度会快点,而且省流量. 3.多线程处理,不要死等网络操作的结果,把耗时工作及计算放在子线

[2013百度软件研发笔试题] 求字符串中连续出现同样字符的最大值

题目完整描写叙述为:用递归的方式实现一个求字符串中连续出现同样字符的最大值.如aaabbcc,连续出现a的最大值为3,abbc,连续出现字符最大的值为2. 下面是我想出来的方法: #include <iostream> using namespace std; #define MAX(a, b) (a) > (b) ? (a) : (b) int Get(char *s, int n, int m)  //字符指针, 当前最长串, max最长串 {     if(*(s+1) == '\