正则表达式匹配c++基础题

class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();

    auto matches = [&](int i, int j) {
        if (i == 0) {
            return false;
        }
        if (p[j - 1] == '.') {
            return true;
        }
        return s[i - 1] == p[j - 1];
    };

    vector<vector<int>> f(m + 1, vector<int>(n + 1));
    f[0][0] = true;
    for (int i = 0; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (p[j - 1] == '*') {
                f[i][j] |= f[i][j - 2];
                if (matches(i, j - 1)) {
                    f[i][j] |= f[i - 1][j];
                }
            }
            else {
                if (matches(i, j)) {
                    f[i][j] |= f[i - 1][j - 1];
                }
            }
        }
    }
    return f[m][n];
}

};
这是力扣上的官方答案,希望来个认真负责的大佬回答我几个问题
问:auto matches = [&](int i, int j)可以更改为auto matches(int i,int j)吗,为什么
问: return s[i - 1] == p[j - 1]; s[i - 1]和p[j - 1]万一不相等怎么办,强制让他等于*吗
问: f[i][j] |= f[i - 1][j];按位或在二维数组中有什么用呢,能将详细点吗,他会直接改变f[i][j] 中的数值吗
问:f[i][j]数组里面是什么呢,truefalse还是s,p;如果是s,p为什么return后是turnfalse
问:我看别的数组的第一位是从0开始的int i=0;i<n。而这个f[i][j]是从1开始的,0只是他的边界值f[0][0] = true;

img

img


#include <iostream>
#include<vector>
using namespace std;



bool isMatch(string s, string p) {
    int m = s.size();
    int n = p.size();

    auto matches = [&](int i, int j) {
        if (i == 0) {
            return false;
        }
        if (p[j - 1] == '.') {
            return true;
        }
        return s[i - 1] == p[j - 1];
    };

    vector<vector<int>> f(m + 1, vector<int>(n + 1));
    f[0][0] = true;
    for (int i = 0; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (p[j - 1] == '*') {
                f[i][j] |= f[i][j - 2];
                if (matches(i, j - 1)) {
                    f[i][j] |= f[i - 1][j];
                }
            }
            else {
                if (matches(i, j)) {
                    f[i][j] |= f[i - 1][j - 1];
                }
            }
        }
    }
    return f[m][n];
}



int main()
{
    string s = "aa";
    string p = "a*";
    bool test=isMatch(s, p);
    std::cout << test<<endl;
    return 0;
}

题目贴出来?或者给出输入输出,不然谁都不知道你这个匹配是匹配什么东西的,两个语句匹配还是正则表达式匹配语句。靠猜只能回答一部分的问题,直接给出输入输出上对代码debug一下就知道了。
你的问题在没有输入输出之前勉强能回答,2和5正确与否不敢保证。
1,matches能不能换的问题。可以换,auto matches = [&](int i, int j)相当于lambda表达式,可以替换为函数,结果是一样的。
2.return s[i - 1] == p[j - 1];如果这两个不相等,这条语句就是等效于return false;是否强制等于*有待商榷
3.f[i][j]这个数组是int类型的二维数组,初始化之后全部为0,f[0][0]=true=1,所以你说的按位与其实就是0和1的与真值表,0|0=0,0|1=1等等。是否改变f[i][j]的值不好说,要看真值表的结果是否改变,如果原来是0,与结果是1就会改变,与结果是0就不变。
4.f[i][j]数组里面像上面说的就是0和1,vector<vector> f(m + 1, vector(n + 1));这句初始化的时候都是0.
5.从1开始是因为你看下面的代码中有出现i-1和j-1的情况,如果从0开始,那么这里就会越界。而且0应该是起着初始标记为的存在