news 2026/4/15 20:50:01

- - - 正则表达式匹配 diff - - -

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
- - - 正则表达式匹配 diff - - -

题目要求是给一个字符串和一个表达式字符串,要让表达式字符串通过给定的规则,完全的匹配字符串,俩个字符串中的所有字符都要使用到

对于给的这个字符串规则,有几点重要

. 是必须要匹配一个字符 aa ... 是匹配不上的

* 这个字符前面一定会有一个字符,他不会单独出现,也不会位于字符首

a* 可以匹配空字符串,也就是说 ab c*ab 也是能匹配上的

.* 他能被翻译 ....... 若干个点也就是可以匹配任意的字符串

那么现在就可以着手开始解这道题了

对于 s 字符串 p 表达式字符串 他俩的匹配

前面的mis都是相同的,而到第一个*时,发现*前面时s 于是s*可以翻译为 空 s ss sss 等,而这些情况是都需要储存下来的,因为*后面的s 是需要找到一个 s* 翻译为 ssss 这个字符串,才能正确的匹配字符串,而我再走到s*翻译时,并不会知道后面的字符串时需要翻译为哪个才能正确表示

所以需要全部储存下来,而这样就有了一个表达式

到p位置的字符串能否翻译 = p 位置 和 s 位置相同 && p 位置之前的字符串 和 s 位置 之前的字符串能匹配上

很容易看出了,动态规划解法,而且需要一个二维的dp表,表示p s字符串的位置,用dp来表示俩字符串的匹配关系

那么dp表定义就有了 dp[m][n] 表示0 - m 长度的字符串 和 0 - n 长度的匹配字符串能否匹配上

比如 dp[2][3] = true 表示 长度为 0 - 2 的 s 字符串 和 长度为 0- 3 的匹配字符串能匹配上

状态方程的推导

整理下 最终的推导方程

初始化

首先多一行多一列防止越界

对边界特殊处理

0 0 位置俩都为空可以被匹配 所以 dp[0][0] = true

dp[x][0] 表示表达式字符串为空 那么一个都匹配不上,所以全为false

dp[0] 表示需要匹配的字符串为空 应为有 a* 这种在 它可以表示空 所以需要给特殊处理为为true

dp[0][2] = true p[0-1] 能翻译为空

dp[0][4] = true p[0-1] 为空 p[2 - 3] 为空

之后越界了 不过如果不为* 就退出处理,因为之后的都匹配不上空的s字符串了

到这就可以开始些代码了

public boolean isMatch1(String ss, String pp) { char[] s = ss.toCharArray(); char[] p = pp.toCharArray(); int m = s.length; int n = p.length; // m 表示 字符串 n 规则 boolean[][] dp = new boolean[m + 1][n + 1]; //只有. 会涉及到 i-1 j-1 dp[0][0] = true; //初始化 因为 a8 可以翻译为空字符串 所以需要特殊处理开头 for(int i = 2; i < n + 1; i += 2){ if(p[i - 1] == '*') dp[0][i] = true; else break; } for(int i = 1; i < m + 1; i++){ for(int j = 1; j < n + 1; j++){ char curS = s[i - 1]; char curP = p[j - 1]; if(curP == '.' || curS == curP){ dp[i][j] = dp[i - 1][j - 1]; }else if(curP == '*'){ dp[i][j] = dp[i][j - 2] || (p[j - 2] == curS || p[j - 2] == '.') && dp[i - 1][j]; } } } return dp[m][n]; }

wok 写了3小时+ 这真是我做过的最难的动态规划题 且时最难的递归题

挺有意思的 尤其是最后的为空的特殊处理,给我迷了好一会

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:05:46

EmotiVoice情感语音生成在婚礼主持词定制中的应用

EmotiVoice情感语音生成在婚礼主持词定制中的应用 在一场婚礼上&#xff0c;当主持人用新郎父亲那熟悉的嗓音缓缓念出“我把我最珍贵的女儿交到你手上”时&#xff0c;台下宾客悄然落泪——而这位“父亲”其实已离世多年。这不是电影桥段&#xff0c;而是借助EmotiVoice实现的真…

作者头像 李华
网站建设 2026/4/16 10:22:15

EmotiVoice如何生成老年人声音特征?技术细节

EmotiVoice如何生成老年人声音特征&#xff1f;技术细节 在智能语音助手逐渐走进千家万户的今天&#xff0c;我们是否注意到——当系统用清脆年轻的嗓音提醒一位80岁的老人“该吃药了”&#xff0c;那种格格不入的疏离感&#xff1f;这种“代际错位”暴露了一个长期被忽视的问…

作者头像 李华
网站建设 2026/4/16 10:22:17

EmotiVoice语音合成引擎的静音检测与处理机制

EmotiVoice语音合成引擎的静音检测与处理机制 在当前AI语音技术快速演进的背景下&#xff0c;用户对语音合成系统的要求早已超越“能说话”的基础阶段&#xff0c;转向更深层次的情感表达、个性还原和交互自然性。像EmotiVoice这样的高表现力TTS引擎之所以脱颖而出&#xff0c;…

作者头像 李华
网站建设 2026/4/16 11:13:45

PySide6从0开始学习的笔记(七) 控件(Widget)之文字输入类控件

文字输入类控件用于接收用户文本 / 数值输入&#xff0c;是表单、设置界面的核心组件。1. QLineEdit&#xff08;单行文本框&#xff09;核心作用&#xff1a;单行文本输入&#xff08;如用户名、密码、搜索框&#xff09;。关键特性&#xff1a;密码模式&#xff1a;setEchoMo…

作者头像 李华
网站建设 2026/4/15 11:17:56

贫血模型 vs 充血模型:前端业务逻辑应该写在 Service 层还是 Entity 类中?

贫血模型 vs 充血模型:前端业务逻辑该写在 Service 层还是 Entity 类中? 各位开发者朋友,大家好!今天我们来聊一个看似简单、实则非常关键的话题——贫血模型(Anemic Domain Model)与充血模型(Rich Domain Model)的区别,以及在实际项目中,业务逻辑到底应该放在 Serv…

作者头像 李华
网站建设 2026/4/16 2:44:58

IndexedDB 事务模型:读写锁、版本迁移与游标(Cursor)遍历

IndexedDB 事务模型详解:读写锁、版本迁移与游标遍历 各位开发者朋友,大家好!今天我们来深入探讨一个常被忽视但极其重要的 Web API —— IndexedDB。它是一个浏览器端的 NoSQL 数据库,广泛用于离线应用、缓存数据和本地持久化存储场景。在实际开发中,我们经常遇到的问题…

作者头像 李华