动态规划-正则表达式匹配

求解代码

java 复制代码
public boolean match (String str, String pattern) {
        int m = str.length();
        int n = pattern.length();

        boolean[][] dp = new boolean[m+1][n+1];

        for(int i=0;i0&&(str.charAt(i-1)==pattern.charAt(j-1)||pattern.charAt(j-1)=='.')){
                            dp[i][j]=dp[i-1][j-1];
                        }
                    }else{
                        if(j>=2){
                            dp[i][j]|=dp[i][j-2];
                        }

                        if(i>=1&&j>=2&&(str.charAt(i-1)==pattern.charAt(j-2)||pattern.charAt(j-2)=='.')){
                            dp[i][j]|=dp[i-1][j];
                        }
                    }
                }
            }               
        }
        return dp[m][n];
    }

小贴士

DP这个boolean数组,dp[i][j]的意思是str的前i个字符和pattern的前j个字符,能否匹配成功。

这里的DP数组,考虑了下标0位置的空字符串,所以为了存储整个字符串,DP数组长度需要+1

这里没有像编辑距离那题一样单独处理初始化逻辑,而是在嵌套for循环的逻辑中处理的,这样代码会更简洁一些。

这里有个细节需要注意一下就是,dp[i][j] i/j个字符,所以pattern j个字符对应原字符串的下标为j-1的字符,其实和【编辑距离】的下标转换是一样的。

pattern非空的时候,大范围是考虑了pattern[j-1]是否为*两种情况。

1.当pattern[j-1]不是*时,如果str非空并且和str[j-1]相对或者pattern[j-1]直接是.的话,说明匹配成功。

2.当pattern[j-1]*的话,就需要考虑是零次匹配前面的字符 还是匹配多次前面的字符的问题了。

因为pattern[j-1]*,所以pattern[j-2]就是*的前驱字符,那处理这类情况就应该着重看看pattern[j-2]了。

  • 如果是匹配0次前驱字符,那patternj-2j-1位都可以舍弃,此时要判断stri个和patternj个是否匹配,等价于判断stri个和patternj-2个是否匹配。

  • 如果是匹配了多次前驱字符,那就让pattern保持不动,让str的前i-1个字符和pattern的前j个字符继续匹配。

相关推荐
Zero18 小时前
机器学习微积分--(1)核心思想
人工智能·算法·机器学习
有Li18 小时前
一种病理学内容感知变速率学习图像压缩框架 (PathoLIC)/文献速递-多模态应用技术
人工智能·深度学习·算法·计算机视觉·医学生
x_xbx18 小时前
LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
Ricky_Theseus19 小时前
数据库关系代数 - 连接操作
linux·数据库·算法
绿算技术19 小时前
宝辰股份董事长莅临绿算技术调研交流
人工智能·科技·算法
码云数智-园园19 小时前
哈希冲突的解决之道:深入理解哈希表底层原理
算法·哈希算法
qq_4160187219 小时前
C++中的模板方法模式
开发语言·c++·算法
天上路人19 小时前
A-59F 多功能语音处理模组在本地会议系统扩音啸叫处理中的技术应用与性能分析
人工智能·神经网络·算法·硬件架构·音视频·语音识别·实时音视频
yang_B62120 小时前
噪声处理方法
大数据·人工智能·算法
菜菜小狗的学习笔记20 小时前
剑指Offer算法题(九)搜索
数据结构·算法·深度优先