博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 10 正则表达式匹配
阅读量:5922 次
发布时间:2019-06-19

本文共 1660 字,大约阅读时间需要 5 分钟。

描述:

实现.和*号匹配,*表示前面字符0~无穷个,.表示任意一个字符。

要求全部,匹配,不是部分匹配。

 

解决:

思路类似最长公共子序列,

dp[i][j] = dp[i - 1][j - 1], 如果s[i] == p[j] || p[j] == '.'

              dp[i][j - 2], 如果p[j] == '*' && s[i] != p[j - 1]

              dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1] || dp[i - 1][j - 2] || dp[i][j - 2], 如果p[j] == '*' && s[i] == p[j - 1]

稍稍解释下:

对于s和p,设各个最后一个字符为x, y,p的倒数第二字符为z,除此外前面字符设为S,P,则:

s = Sx

p = Pzy

如果x == y或y == '.',则如果S和Pz匹配,则s和p匹配,因为最后两字字母是匹配的。这就缩减了问题规模。

而对于y ==  '*'的情况,需要考虑z:

    如果x != z,则只有在s和P匹配的情况下,s和p才匹配。

    如果x == z,设匹配符号为~吧,方便,则如果S~P,S~Pz,S~Pzy,Sx~P,Sx~Pz,都可得出s和p匹配。

 

代码压缩了空间,用一些额外变量保存会用到的变量。时间复杂度O(m*n),空间复杂度O(n)。

bool cmatch(char s, char p) {    return p == '*' || p == '.' || s == p;}bool isMatch(string s, string p) {    int m = s.size();    int n = p.size();    bool* arr = new bool[n + 1]();    arr[0] = 1;    for (int i = 2; i <= n; ++i)        if (p[i - 1] == '*' && arr[i - 2] == true) arr[i] = true;    int j2 = arr[0];    int j1 = arr[1];    int sa = arr[2];    for (int i = 1; i <= m; ++i) {        for (int j = 0; j <= n; ++j)            if (j == 0) {                j2 = arr[0];                arr[0] = false;            }            else if (j == 1) {                j1 = arr[1];                arr[1] = i == 1 && cmatch(s[0], p[0]);            }            else {                sa = arr[j];                if (p[j - 1] == '*')                    arr[j] = cmatch(s[i - 1], p[j - 2]) && (arr[j] || arr[j - 1] || j1 || j2 || arr[j - 2])?true:arr[j - 2];                else                    arr[j] = cmatch(s[i - 1], p[j - 1])?j1:false;                j2 = j1;                j1 = sa;            }    }    return arr[n];}

转载于:https://www.cnblogs.com/willaty/p/8134672.html

你可能感兴趣的文章
java与xml
查看>>
Redis Sentinel机制与用法(二)
查看>>
ls命令实际使用
查看>>
磁盘及磁盘阵列系统选择
查看>>
Javascript异步数据的同步处理方法
查看>>
9. Palindrome Number(回文数)(leetcode)
查看>>
MySQL之自定义函数实例讲解
查看>>
用.htaccess获取文件夹和文件名
查看>>
自我提升mysql
查看>>
步步为营之——建造者模式(Builder)
查看>>
快速排序——Java
查看>>
unity游戏与我
查看>>
187. Repeated DNA Sequences
查看>>
避免头文件重复包含
查看>>
Oracle:Authid Current_User的使用
查看>>
陈天桥:欣赏360保护隐私 用户安全永远第一
查看>>
JMeter使用技巧
查看>>
【Jump Game II 】cpp
查看>>
ubuntu 下 apache+tomcat整合_(mod-jk方法)[转]
查看>>
记录编译Hi3559A时遇到的一些错误和解决方法
查看>>