10Regular Expression Matching

来源:互联网 发布:sdl区域分割算法 编辑:程序博客网 时间:2024/05/01 07:06

这题是正则表达式匹配,允许使用. *两个符号。

".*"可以匹配任意的字符串,需要注意。

这题我做的关键是分情况考虑,做dp,f[i][j]==True表示字符串到i和模式串到j能够匹配。

在模式串p中,每个字符有3种可能: 字母、"*"、"."。

如果是字母,则f[i][j]=f[i-1][j-1] and s[i]==p[j] 最简单

如果是".",则f[i][j]=f[i-1][j-1] 也很简单

关键是"*"很复杂,进一步展开

首先可以赋值 f[i][j]=f[i][j-2] (当然此时要求j>=2,下同,如果j==1则特殊处理一下即可)

如果p[j-1]=="." 那么 p[j-1]和p[j]本身是可以匹配任意多字符串的  因此f[i][j]= f[i][j] or  f[st][j-2]  

如果p[j-1]==字母a,那么p[j-1]和p[j]要么不匹配任何(也就是“首先”对应的情况),要么匹配1个或多个相同的字母a 于是f[i][j]=f[i][j] or f[st][j-2] 保证s[st+1]==字母a 

边界情况也要认真考虑。

此题细节实在不少,我提交了7次才过去。

0 0
原创粉丝点击