力扣(十)正则表达式匹配

题目描述
在这里插入图片描述
我直接用了正则表达式的算法,不提也罢。

官方解题

public class Solution {
    public bool IsMatch(string s, string p) {  
        bool[,] result = new bool[s.Length+1,p.Length+1];
            result[s.Length, p.Length] = true;

            for (int i = s.Length; i >= 0; i--)
            {
                for (int j = p.Length-1; j >= 0; j--)
                {
                    bool F_ck = (i < s.Length && (s.ElementAt(i) == p.ElementAt(j) || p.ElementAt(j) == '.'));
                    if (j + 1 < p.Length && p.ElementAt(j+1) == '*')
                    {
                        result[i, j] = F_ck && result[i+1, j] || result[i, j+2];
                    }
                    else
                    {
                        result[i, j] = F_ck && result[i + 1, j+1];
                    }
                }
            }
            return result[0,0];
    }
}

解题思想:
1、创建一个bool类型二维数组,存放每个P中字符可与S匹配成功的结果;
2、结果格式:result[i, j] = F_ck && result[i + 1, j+1]; 代表上个字符匹配结果影响之后匹配结果(注:一旦有一个字符未匹配成功,那之后的所有匹配结果都为false,最终result[0,0]也会为false);
3、F_ck 代表当前两个字符是否匹配,考虑p中存在字符“.”的情况;

(s.ElementAt(i) == p.ElementAt(j) || p.ElementAt(j) == '.')

4、当p存在字符“*”时(j+1位置),那p(j+1)位置无效,不需要匹配,这其中存在两种种情况:
① 匹配零个前面元素

	string s = "abc";
    string p = "a*bc";
    //处理该情况代码
    result[i, j] = F_ck && result[i+1, j] || result[i, j+2];
    //j+1为*,s的字符“a”与p的字符“a”匹配(F_ck ),且s的字符“b”与p的字符“b”匹配(result[i, j+2])固为true

① 匹配一个前面元素

	string s = "aac";
    string p = "a*c";
    //处理该情况代码
    result[i, j] = F_ck && result[i+1, j] || result[i, j+2];
    //j+1为*,s的第二个字符“a”与p的字符“a”匹配 固为true(result[i+1, j]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值