您的位置:首页 > 产品设计 > UI/UE

2014年阿里研发笔试题:在text中找出以同样的顺序连续出现在query中的最长连续字母序列的长度

2015-03-15 18:36 519 查看
http://www.cnblogs.com/zhangchaoyang/articles/2012070.html
讲的比较详细

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

思想:用vector建立一个二维向量markMatrix,markMatrix[i][j]表示最长连续字母以query[i]结尾时的长度,

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int FindMaxLength(string query, string text)
{

int m = query.length();
int n = text.length();
vector<vector<int>> markMatrix(m, vector<int>(n,0)); // m行n列的矩阵
int i = 0, j = 0;

int maxLen = -1;
for (i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (query[i] == text[j])
{
if (i == 0 || j == 0)
{
markMatrix[i][j] = 1;
}
else
{
markMatrix[i][j] = markMatrix[i - 1][j - 1] + 1;
}
}
if (markMatrix[i][j] > maxLen)
maxLen = markMatrix[i][j];
}
}
return maxLen;
}
//第二种方法,压缩空间,注意:
<pre name="code" class="cpp">int main()
{
string text = "acddef";
string query = "cdd";
int tlen = text.length();
int qlen = query.length();
int* dp = new int[qlen];
int maxlen = -1;
int maxInd = -1;
memset(dp, 0, sizeof(int)*qlen);
for (int i = 0; i < tlen;++i)
for (int j = qlen - 1; j >= 0; --j)
{
if (text[i] == query[j])
{
if (i == 0 || j == 0)
dp[j] = 1;
else
{
dp[j] = dp[j - 1]+1;
}
}
else
{
dp[j] = 0;
}
if (dp[j] > maxlen)
{
maxlen = dp[j];
maxInd = j;
}
}
cout << maxlen <<","<< maxInd << endl;
for (int i = maxInd - maxlen + 1; i <= maxInd; ++i)
cout << query[i];
cout << endl;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐