列表

详情


XM12. 序列模式匹配

描述

给定文本text和待匹配字符串pattern,二者皆只包含小写字母,并且不为空。
在text中找出匹配pattern的最短字符串,匹配指按序包含pattern,但不要求pattern连续。
如text为abaacxbcbbbbacc,pattern为cbc,text中满足条件的是abaacxbcbbbbacc下划线部分。

输入描述

多行,每行一个text和一个pattern,用空格分隔。
保证1<=|text|,|pattern|<=1000,Σ|text|,Σ|pattern|<=10000。

输出描述

输出最短匹配序列起止位置(位置下标从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;
    }
}

上一题