XM12. 序列模式匹配
描述
给定文本text和待匹配字符串pattern,二者皆只包含小写字母,并且不为空。输入描述
多行,每行一个text和一个pattern,用空格分隔。输出描述
输出最短匹配序列起止位置(位置下标从0开始),用空格分隔。若有多个答案,输出起止位置最小的答案;若无满足条件的答案,则起止均为-1。示例1
输入:
abaacxbcbbbbacc cbc abc x aaabcac ac
输出:
4 7 -1 -1 5 6
C 解法, 执行用时: 3ms, 内存消耗: 384KB, 提交时间: 2020-08-21
#include<stdio.h> #include<string.h> #define MAXLEN 1010 char text[MAXLEN],pat[MAXLEN]; int ST = -1,END=-1; void solve(int tl,int pl) { int p=0; int delta = tl+1; int st=-1,end=-1; for (int j=st+1;j<tl-pl;j++) { for(int i=st+1;i<tl;i++) { if (pat[p] == text[i]) { if (p==0) { st = i; } if (p==pl-1) { end = i; p =0; break; } p++; if (p>=pl) { p =0; break; } } } p=0; if (end!=-1) { if(delta>end-st) { delta = end-st; ST =st; END = end; } } end = -1; } printf("%d %d\n",ST,END); ST =-1; END =-1; } int main() { while(scanf("%s%s", text, pat) != EOF) { int tl = strlen(text); int pl = strlen(pat); solve(tl, pl); } return 0; }
C++14 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2020-09-26
#include <iostream> #include <string> #include <climits> using namespace std; int main(){ string s,t; while(cin>>s>>t){ int n=s.size(),m=t.size(),a=-1,b=-1,l=-1,r=-1,min=INT_MAX; for (int i=0,j=0;i<n;i++){ if (s[i]==t[j]){ if (j==0) a=i; j++; } if (j==m){ b=i,j=0; if (b-a<min){ min=b-a; l=a,r=b; } i=a; } } cout<<l<<" "<<r<<endl; } }
C++ 解法, 执行用时: 3ms, 内存消耗: 484KB, 提交时间: 2020-08-24
#include <bits/stdc++.h> //我的不行 using namespace std; int main(){ string s,t; while(cin>>s>>t){ int n=s.length(), m=t.length(), a=-1, b=-1, l, r, Min=INT_MAX; for(int i=0,j=0;i<n;i++){ if(s[i]==t[j]){ if(j==0) a = i; j++; } if(j==m){ j = 0; b = i; if(b-a<Min){ Min = b - a; l = a; r = b; } i = a; } } if(b==-1) cout<<-1<<" "<<-1<<endl; else cout<<l<<" "<<r<<endl; } }
C++ 解法, 执行用时: 3ms, 内存消耗: 492KB, 提交时间: 2020-09-08
#include<bits/stdc++.h> using namespace std; int main(){ string text,pat; while(cin>>text>>pat){ int n=text.length(),m=pat.length(); int a=-1,b=-1,l,r,j=0; int min=INT_MAX; for(int i=0;i<n;i++){ if(text[i]==pat[j]){ if(j==0){a=i;} j++; } if(j==m){ j=0; b=i; if(b-a<min){ min=b-a; l=a; r=b; } i=a; } } if(b==-1){cout<<-1<<" "<<-1<<endl;} else{cout<<l<<" "<<r<<endl;} } return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 508KB, 提交时间: 2020-09-08
#include <bits/stdc++.h> #include <iostream> #include <string> using namespace std; int main() { string text,pattern; while(cin >> text >> pattern) { int p_t,p_p; int l = -1, r = -1; int l_out, r_out; int MIN = INT_MAX; int n_t = text.length(); int n_p = pattern.length(); for(p_t=0,p_p=0; p_t<n_t; p_t++) { if(text[p_t] == pattern[p_p]) { if(p_p == 0) l = p_t; p_p++; } if(p_p == n_p) { r = p_t; if(r - l <MIN) { MIN = r-l; l_out = l; r_out = r; } p_p = 0; p_t = l; } } if(r == -1) cout << -1 << " " << -1 << endl; else cout << l_out << " " << r_out << endl; } }