博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pku Blue Jeans 字符串匹配
阅读量:5937 次
发布时间:2019-06-19

本文共 3241 字,大约阅读时间需要 10 分钟。

学习:

才开始自己,思路搞错了,先把前两个求最长公共子序列,然后依次用最长公共子序列与2,3,4,。。。m比较求最长公共子序列。。贡献了3次wa

直到看到这组数句才发现自己的错误:

13AAATTTGGGTTTGGGAAAGGGTTTAAAprint:AAA
按我的思路会输出TTT的。。唉。。因为前两个最长公共子序列为TTTGGG再将它与第三组比较时,就出来TTT了。而第1,2组可以得到AAA然后在于第三组的AAA才是正确结果。。。没有考虑全面。。
下面直接用函数strstr确定子序列位置爱查找,就避免了这样的错误。。
View Code
#include 
#include
#include
#define maxn 65 using namespace std; char str[12][maxn]; char tmp[maxn],ans[maxn]; int n,m; void solve() {
int i,j,k,l; int maxlen = 0; int len = strlen(str[0]); //O(60^2*m)复杂度 for (i = 0; i < len; ++i) {
for (j = i; j < len; ++j) {
memset(tmp,0,sizeof(tmp)); l = 0; for (k = i; k <= j; ++k) tmp[l++] = str[0][k];//找出子序列 for (k = 1; k < m; ++k) {
if (strstr(str[k],tmp) == NULL)//判断子序列在串中出现的首位置,如果没有返回空 //第一次使用这个函数。。 break; } if (k == m) {
if (l > maxlen) {
strcpy(ans,tmp); maxlen = l; } else if (l == maxlen && strcmp(ans,tmp) > 0) {
strcpy(ans,tmp); } } } } if (maxlen >= 3) printf("%s\n",ans); else printf("no significant commonalities\n"); } int main() {
int i; cin>>n; while (n--) {
cin>>m; for (i = 0; i < m; ++i) cin>>str[i]; solve(); } return 0; }
KMP算法实现
View Code
#include 
#include
#include
#define maxn 65using namespace std;char str[12][maxn];char ans[maxn],tmp[maxn];int n,m;int next[maxn];void get_next(char *p,int len){ int i,j; i = 0; j = -1; next[0] = -1; while (i < len) { if (j == -1 || p[j] == p[i]) { i++; j++; next[i] = j; } else j = next[j]; }}bool kmp(char *p,int len){ int i,j,k; memset(next,0,sizeof(next)); get_next(p,len); for (k = 1; k < m; ++k) { int slen = strlen(str[k]); i = 0; j = 0; while (i < slen && j < len) { if (j == -1 || p[j] == str[k][i]) { i++; j++; } else { j = next[j]; } } if (j < len) break; } if (k == m) return true; else return false;}void solve(){ int i,j,k; int len = strlen(str[0]); int maxlen = 0; for (i = 0; i < len; ++i) { for (j = i; j < len; ++j) { memset(tmp,0,sizeof(tmp)); int l = 0; for (k = i; k <= j; ++k) { tmp[l++] = str[0][k]; } if (kmp(tmp,l)) { if (l > maxlen) { maxlen = l; strcpy(ans,tmp); } else if (l == maxlen) { strcpy(ans,tmp); } } } } if (maxlen >= 3) printf("%s\n",ans); else printf("no significant commonalities\n");}int main(){ int i; cin>>n; while (n--) { cin>>m; for (i = 0; i < m; ++i) cin>>str[i]; solve(); } return 0;}

 

 

转载地址:http://zgctx.baihongyu.com/

你可能感兴趣的文章
【原创】 熵与反熵
查看>>
MinnowBoard MAX 硬件开发板
查看>>
六种Socket I/O模型幽默讲解
查看>>
技术干货:使用静态缓存提升网站性能的五种方法!
查看>>
MySQL内核月报 2014.12-MySQL· 性能优化·thread pool 原理分析
查看>>
[收藏学习]关于Linux服务器时间同步nptdate
查看>>
告别1人年,教你21天搭建推荐系统!
查看>>
利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控
查看>>
C# 异常处理(Catch Throw)IL分析
查看>>
抽象工厂模式
查看>>
获取Checkbox的值
查看>>
【Mongodb】 replica set 添加和删除节点。
查看>>
[UI] 精美UI界面欣赏[6]
查看>>
聊聊JVM的年轻代
查看>>
《重构—改善既有代码设计》——第二章重构原则——学习笔记
查看>>
【原创】C#玩高频数字彩快3的一点体会
查看>>
Sqoop(2)
查看>>
【案例】说说time_zone 带来的性能问题
查看>>
BaseHTTPServer与CGIHTTPServer源码分析
查看>>
Xcode10.2中LLDB增加的新特性
查看>>