[编程题]序列模式匹配
给定文本text和待匹配字符串pattern,二者皆只包含小写字母,并且不为空。
在text中找出匹配pattern的最短字符串,匹配指按序包含pattern,但不要求pattern连续。
如text为abaacxbcbbbbacc,pattern为cbc,text中满足条件的是abaacxbcbbbbacc下划线部分。
输入描述:
多行,每行一个text和一个pattern,用空格分隔。
保证1<=|text|,|pattern|<=1000,Σ|text|,Σ|pattern|<=10000。
输出描述:
输出最短匹配序列起止位置(位置下标从0开始),用空格分隔。若有多个答案,输出起止位置最小的答案;若无满足条件的答案,则起止均为-1
/*
我的思路是暴力搜索,首先设定初值,代表起始点和终点,长度?
然后开始遍历第一个字符串的每一个位置:
1. 以字符串的每一个符合条件的为起点,遍历搜索,若能搜到,记录下长度,起始点,终点
2. 本次循环结束后,判断是否为最短,是的话更新起始点
3.继续遍历后面
*/
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <string>
using namespace std;
void getRet(string &a,string &b){
int alen=a.size(),blen=b.size();
int start=-1,end=-1,len=a.size()+1;
for(int i=0;i<alen;i++){
if(a[i]==b[0]){
int start1=i,start2=0;
while(start1<alen && start2<blen){
if(a[start1]==b[start2])
start2++;
start1++;
}
if(start2==blen){
if(start1-i<len){
start=i;
end=start1-1;
len=start1-i;
}
}
}
};
cout<<start<<" "<<end<<endl;
}
int main(){
string a,b;
while(cin>>a>>b){
getRet(a,b);
}
return 0;
}
网友评论