美文网首页
9.11 小米上机试题

9.11 小米上机试题

作者: HamletSunS | 来源:发表于2019-10-23 23:34 被阅读0次

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

    相关文章

      网友评论

          本文标题:9.11 小米上机试题

          本文链接:https://www.haomeiwen.com/subject/sxuiyctx.html