OR29. 串的模式匹配
描述
对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。
给定两个字符串A和B,及它们的长度lena和lenb,请返回题目所求的答案。
"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; } };