题解 | #字符串通配符#

字符串通配符

http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

双指针,贪心+回溯。时间复杂度O(nm),空间复杂度O(1)

#include <bits/stdc++.h>

using namespace std;

bool isnum(char s)  {
    if( s>= '0' && s<='9') {
        return true;
    }
    return false;
}

bool isword(char s) {
    if( s>= 'a' && s<= 'z') {
        return true;
    }
    if( s>= 'A' && s<= 'Z') {
        return true;
    }
    return false;
}

int main() {
    string p;
    cin>>p;
    string s;
    cin>>s;
    int sl = s.length();
    int pl = p.length();
    //双指针移动两个元素
    int i = 0, j = 0;
    //记录匹配到'*'的位置,方便操作
    int marks = -1, markp = -1;
    transform (s.begin(), s.end(), s.begin(), ::toupper);
    transform (p.begin(), p.end(), p.begin(), ::toupper);
    while (i < sl) { 
        if (j != pl && (s[i] == p[j] || (p[j] == '?' && ( isnum(s[i]) || isword(s[i]) )  )  )) {
          //直接字符匹配或者p里面是'?',直接走
            i++;
            j++;
        }
        else if (j != pl && p[j] == '*') {
          //是'*'时,记录当前i和j,并且先把j指针走一步
            marks = i;
            markp = j;
            j++;
        }
        else if (markp != -1 && ( isnum(s[marks]) || isword(s[marks]) ) ) {
          //j走一步后和i不匹配,则需要用'*'匹配掉当前i。i往前走一步,j回到mark点的下一个位置,再继续比较
            i = marks + 1;
            j = markp + 1;
            marks++;
        }
        else {
          //没有完全匹配或者匹配不正确
            cout<<"false"<<endl;
            return 0;
        }
    }
    while (j < pl) {
      //s已经完全匹配完,但是j指针还没有走完的情况
        if (p[j] == '*') 
            j++ ;
        else{
            cout<<"false"<<endl;
            return 0;
        }
    }
    cout<<"true"<<endl;
    return 0;
}

全部评论

相关推荐

微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
10-15 16:27
门头沟学院 C++
LeoMoon:建议问一下是不是你给他付钱😅😅
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务