c++-串的模式匹配
题目描述
对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。
给定两个字符串A和B,及它们的长度lena和lenb,请返回题目所求的答案。
测试样例:
"acbc",4,"bc",2
返回:2
这道题还是比较简单的:
class StringPattern {
public:
int findAppearance(string A, int lena, string B, int lenb) {
// write code here
int i=0;
int j=0;
int res=-1;
int flag=1;
if(A==B)
return 0;
if(lenb>lena)
return -1;
for(auto c1: A){
if(c1!=B[j] && j<lenb){
j=0;
flag=1;
if(c1!=B[j]){
i++;
continue;
}
}
if(c1==B[j] && j<lenb){
j++;
if(flag==1)
res=i;
i++;
flag=0;
}
if(j==lenb){
return res;
}
}
return -1;
}
};
这里的flag是为了确保res的值只会在字符串B的第一个与A匹配时,被赋值为i,在字符串B第二或第三或后面的字符匹配时,不会改变res。
而第一个if中还有一个if,是为了:当B中第二或第三或后面的字符与A不匹配时,不会直接continue,也就是不会跳过A的这个字符,而是会检查A这个与B中后面不匹配的字符是否与B中第一个字符匹配。
A: bbac
B: bac
也就是会检查A的第二个b是不是与B的第一个b匹配。而不会导致,直接A的a与B的b比较,防止漏判。
posted on 2017-12-15 11:26 sichenzhao 阅读(360) 评论(0) 编辑 收藏 举报