字符串匹配

字符串匹配

http://www.nowcoder.com/questionTerminal/fbdc522ef958455687654b38a4ca01e0

思路:(1)使用普通的字符串匹配方式;(2)遇到括号时单独匹配;(3)每次记录匹配开始的位置;

// c++代码如下
#include <iostream>
using namespace std;
const int sub1 = 'a'-'A',sub2 = 'A'-'a'; // 为了匹配大小写字母
// 因为模式串内不一定只有一对中括号,所以对每一对中括号进行匹配
bool pipeizhongkuohao(char c,string pat,int left,int right) 
// left表示'['下标,rirht表示']'下标
{
    for(int i = left;i<=right;i++) // 这里可以从left+1开始,匹配到right-1结束
    {
        if(c == pat[i] || c == pat[i]+sub1 || c==pat[i]+sub2) return true;
    }
    return false;
}
// 字符串匹配,主串和模式串
int pipei(string str,string pat)
{
    int i = 0,j = 0,k = 0;
    // i表示每次匹配中的主串与匹配位置偏差,j表示模式串偏差,k表示主串匹配开始位置
    while(k<str.size()&&k+i<str.size()&&j<pat.size())
    {
        // 遇到中括号使用中括号匹配
        if(pat[j] == '[')
        {
            int left = j,right = j+1; // 左括号位置
            for(right;pat[right]!=']';right++); // 右括号位置
            bool flag = pipeizhongkuohao(str[k+i],pat,left,right);
            if(flag)
            {
                // 匹配成功,主串偏差值+1,模式串偏差指向右括号下一位置
                i++;j = right+1;
                if(j == pat.size()) return k; // 结束条件
            }
            else{
                // 匹配失败,主串匹配位置+1,偏差均置0,重新匹配
                k++;i=0;j=0;
            }
        }
        else // 字符匹配
        {
            if(str[k+i] == pat[j] || str[k+i] == pat[j]+sub1 || str[k+i] == pat[j] + sub2)
            {
                i++;j++; // 偏差值均+1
                if(j == pat.size())  return k;
            }
            else
            {
                k++;i=0;j=0;
            }
        }
    }
    // 匹配失败
    return -1;
}

int main()
{
    int n;
    while(cin >> n)
    {
        string str[n];
        for(int i = 0;i<n;i++)
            cin >> str[i];
        string pattern;
        cin >> pattern;
        for(int i = 0;i<n;i++)
        {
            if(pipei(str[i],pattern)!=-1) cout << i+1 << ' ' << str[i] << endl;
        }
    }
}
全部评论
注释好评👍
点赞 回复 分享
发布于 2021-09-08 16:40

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务