【算法练习】字符串处理 牛客网 字符串匹配

题目链接:https://www.nowcoder.com/practice/fbdc522ef958455687654b38a4ca01e0?tpId=40&tqId=21518&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

题目描述

读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。

输入描述:

输入有多组数据。
每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。

输出描述:

输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。

示例1

输入

复制

4
Aab
a2B
ab
ABB
a[a2b]b

输出

复制

1 Aab
2 a2B
4 ABB

题目理解:匹配全部的字符串,方括号中的内容是可选,

不区分大小写的匹配,我的做法是把两个字符,如果是小写就转换成大写,然后再进行匹配= =

核心部分代码是

 for(int i=0;i<n;i++){
        int j=0;
        int k=0; //指示匹配字符串

        string s2=str[i];
        while(s2[j]){
            if(pattern[k]=='['){
                while(pattern[++k]!=']'){
                    if(isEqual(pattern[k],s2[j]))  //不区分大小写的匹配
                        break;
                }

                if(pattern[k]==']')
                    break;
                else     //有一个字母匹配所以跳出了
                    while(pattern[++k]!=']');   //就是一直跳过]
            }
            else{
                if(!isEqual(pattern[k],s2[j])){
                    break;
                }
            }
            j++;
            k++;
        }

        if(!pattern[k] && !s2[j]){
            cout<<i+1<<" "<<s2<<endl;
        }
    }

AC代码是

#include<iostream>
#include <string>
#include <vector>
#include <string.h>
using namespace std;

int n;
char pattern[30];
vector<string> str;

bool isEqual(char a,char b){
    //把小写字母都改成大小
    if(a>='a' && a<='z'){
        a=a-'a'+'A';
    }
    if(b>='a' && b<='z'){
        b=b-'a'+'A';
    }

    if(a==b)
        return true;
    else
        return false;

}
int main(){
    cin>>n;
    string s1;
    for(int i=0;i<n;i++){
        cin>>s1;
        str.push_back(s1);
    }
    cin>>pattern;

    //开始匹配
    for(int i=0;i<n;i++){
        int j=0;
        int k=0; //指示匹配字符串

        string s2=str[i];
        while(s2[j]){
            if(pattern[k]=='['){
                while(pattern[++k]!=']'){
                    if(isEqual(pattern[k],s2[j]))  //不区分大小写的匹配
                        break;
                }

                if(pattern[k]==']')
                    break;
                else     //有一个字母匹配所以跳出了
                    while(pattern[++k]!=']');   //就是一直跳过]
            }
            else{
                if(!isEqual(pattern[k],s2[j])){
                    break;
                }
            }
            j++;
            k++;
        }

        if(!pattern[k] && !s2[j]){
            cout<<i+1<<" "<<s2<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40760678/article/details/100066779