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

来源:互联网 发布:新加坡留学知乎 编辑:程序博客网 时间:2024/05/17 02:39

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;}


                                             
0 0
原创粉丝点击