列表

详情


OR29. 串的模式匹配

描述

对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。

给定两个字符串AB,及它们的长度lenalenb,请返回题目所求的答案。

测试样例:
"acbc",4,"bc",2
返回:2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-07-31

class StringPattern {
public:
    
    vector<int>getnext(string& A)
    {
        int len=A.length();
        vector<int>ans(len,-1);
        int k=-1;
        int i=0;
        while(i<len-1)
        {
            if(k<0||A[i]==A[k])
            {
                i++;
                k++;
                if(A[i]==A[k])
                    ans[i]=ans[k];
                else
                    ans[i]=k;
            }
            else
                k=ans[k];
        }
        return ans;
    }
    int findAppearance(string A, int lena, string B, int lenb) {
        // write code here
        
        vector<int>next=getnext(B);
        int i=0;
        int j=0;
        int ans=-1;
        while(i<lena&&j<lenb)
        {
            if(j<0||A[i]==B[j])
            {
                i++;
                j++;
            }
            else
                j=next[j];
            if(j==lenb)
                break;
        }
        return j==lenb?i-j:-1;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 420KB, 提交时间: 2022-05-16

class StringPattern {
public:
    int findAppearance(string A, int lena, string B, int lenb) {
        // write code here
        int i=0;
        int j=0;
        int prev=0;//上一次匹配的位置
        while(i<A.size()&&j<B.size())
        {
            if(A[i]==B[j])
            {
                i++;
                j++;
            }
            else
            {
                j=0;
                i=prev+1;
                prev=i;
            }
        }
        return j==B.size()?prev:-1;
    }
};

上一题