c++-串的模式匹配

题目描述

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

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

测试样例:
"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编辑  收藏  举报

导航