9.11 小米上机试题

2019-10-23  本文已影响0人  HamletSunS

[编程题]序列模式匹配
给定文本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;
}
上一篇 下一篇

猜你喜欢

热点阅读