[LeetCode]题解(python):010-Regular Expression Matching
题目来源:
https://leetcode.com/problems/regular-expression-matching/
题意分析:
这道题目定义了两个正则表达式规则。’.’代表任意字符,’*’代表前一个字符出现任意次。输入两个字符串s,p。如果s可以被p完全匹配则返回True,否则返回False。比如’.*’可以匹配任意字符串。
题目思路:
这道题目如果直接import 正则表达式肯定是不行的,因为题目只定义了2个特殊字符,而正则表达式包括很多特殊字符,所以直接import正则表达式肯定是不行的。
从第一个字符开始搜索,对以下情况进行讨论:
①如果(s[0] == p[0]or p[0] == ‘.’)且p的第二个字符不是’*’,那么如果两个字符同时去掉第一个字符,结果不变。
②如果p[0] == ‘.’且p[1] == ‘*’那么如果存在s[i:],i >= 0被p[2:]完全匹配,则s可以被p完全匹配(s[i:]代表s字符除掉0到i下标的字符)。
③如果p[0] != ‘.’且p[1] == ‘*’,那么如果s[0] != p[0]那么如果s可以被p[2:]匹配,则s可以被p完全匹配。
④如果s[0] == p[0]那么如果存在s[i:](i >= 0 且 s[j] == p[0] 0<= j <i)被p[2:]完全匹配,那么s可以被p完全匹配。
经过上面的分析,这道题目可以用动态规划来做。用b[i][j]来代表由s除掉0到i下标的字符能否被由p除掉0到j下标的字符完全匹配,也就是s[i:]能否被p[j:]完全匹配。根据上一段的分析可以得到:
if p[j + 1] != ‘*’
if s[i] == p[j] or p[j] == ‘.’ then b[i][j] = b[i + 1][j + 1]
fi
else
if p[j] == ‘.’ then
if exist k (i<=k) b[k][j + 2] = true then b[i][j] = true
else b[i][j] = false
fi
else
if exist k(i <= k)b[k][j + 2] = true and all l (0 <= l <k) s[l] = p[0] then b[i][j] =true
else b[i][j] = false
fi
fi
return b[0][0]
PS:由于python的二维数组初始化比较麻烦,或者是因为我对python的不熟,我选择用dictionary来处理,b[i,j]代替b[i][j].
代码(python):
class Solution(object):
def isMatch(self,s, p):
size1 = len(s)
size2 = len(p)
b = {}
s1 = 0
while s1 <= size1:
s2 = 0
while s2 <= size2:
b[s1,s2] = False
s2 += 1
s1 += 1
b[size1,size2] = True
j = size2 - 1
while j >= 0:
if p[j] == '*':
b[size1,j] = False
j -= 1
b[size1,j] = True
j -= 1
else:
break
j = size2 - 1
while j >= 0:
if p[j] == '.':
i = size1 - 1
while i >= 0:
b[i,j] = b[i + 1,j + 1]
i -= 1
elif p[j] != '*':
i = size1 - 1
while i >= 0:
if p[j] == s[i]:
b[i,j] = b[i + 1,j + 1]
else:
b[i,j] = False
i -= 1
else:
i = size1 - 1
if p[j - 1] == '.':
while i >= 0:
k = i
while k <= size1:
if b[k,j + 1]:
b[i,j - 1] =True
break
k += 1
i -= 1
else:
while i >= 0:
k = i
while k <= size1:
if b[k,j + 1]:
b[i,j - 1] = True
break
if k == size1:
break
if p[j - 1] != s[k]:
break
k +=1
i -= 1
j -= 1
j -= 1
return b[0,0]
转载请注明出处:http://www.cnblogs.com/chruny/p/4807234.html
[LeetCode]题解(python):010-Regular Expression Matching的更多相关文章
- [Leetcode][Python][DP]Regular Expression Matching
# -*- coding: utf8 -*-'''https://oj.leetcode.com/problems/regular-expression-matching/ Implement reg ...
- 【LeetCode】010. Regular Expression Matching
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- 【JAVA、C++】LeetCode 010 Regular Expression Matching
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- LeetCode 010 Regular Expression Matching
题目描述:Regular Expression Matching Implement regular expression matching with support for '.' and '*' ...
- 010 Regular Expression Matching 正则表达式匹配
Implement regular expression matching with support for '.' and '*'.'.' Matches any single character. ...
- No.010 Regular Expression Matching
10. Regular Expression Matching Total Accepted: 89193 Total Submissions: 395441 Difficulty: Hard Imp ...
- leetcode第十题--Regular Expression Matching
Problem:Implement regular expression matching with support for '.' and '*'. '.' Matches any single c ...
- LeetCode--No.010 Regular Expression Matching
10. Regular Expression Matching Total Accepted: 89193 Total Submissions: 395441 Difficulty: Hard Imp ...
- LeetCode(10) Regular Expression Matching
题目 Implement regular expression matching with support for '.' and '*'. '.' Matches any single charac ...
- LeetCode(10)Regular Expression Matching
题目如下: Python代码: # -*- coding:utf-8 -*- def ismatch(s,p): #先将dp[s+1][p+1]二维数组全置为False dp = [[False] * ...
随机推荐
- android中viewPager实现的屏幕左右切换(入门篇)
大多数的APP都可以实现几个屏幕来回的切换, 首先新建两个Activity,内容随意,布局随意.接下来在MainActivity.xml: <RelativeLayout xmlns:andro ...
- 【JQ成长笔记】关于$(this).index与$.each的使用
本人菜鸟入门,小庙容不下大神的 O(∩_∩)O~~轻喷~ 工作当中响应某个需求,切换选项卡的一个效果,根据每个选项下的内容元素的总数不同而进行不同的html变化(如果选项卡下的内容为空就等于XXX,否 ...
- Android 判断听云是否嵌入正确
编译打包成apk之后,将apk在手机上进行安装,连接数据线,打开命令行,输入以下命令: adb logcat -v time -s NBSAgent:V 之后运行嵌入听云代码的app,进行有效的网络访 ...
- phpcms v9 万能字段使用
<input type="text" name="info[down]" id="down" value="{FIELD_V ...
- bugfree搭建
- td太多内容显示...
table style="table-layout:fixed;"td style="text-overflow: ellipsis;white-space: nowra ...
- CSS自学笔记(11):CSS3背景和边框
CSS3 背景 在CSS3中新增了多个关于背景的属性,可以让我们对背景有了更多更好的操作,减少用第三方工具对背景图片进行修改美化. CSS3中主要是通过定义backgrounp中的各个属性来控制背景( ...
- TCP粘包拆包问题
阿π 专注于网络协议,系统底层,服务器软件 C++博客 | 首页 | 发新随笔 | 发新文章 | | | 管理 Socket粘包问题 这两天看csdn有一些关于socket粘包,socket缓冲区设置 ...
- Mac OS X:Dock 的附加功能
Dock 提供了可能并非显而易见的有用控件和菜单.通过修饰键的不同组合(如 Option 键.Control 键)及鼠标点按的不同类型(点按与按下及按住),即可使用下列附加功能.本文适用于 Mac O ...
- aix6.1 openssh安装
环境: IBM AIX6.1 1.下载(可以直接从附件中下载): openssl IBM官方网站下载:https://www14.software.ibm.com/webapp/iwm/web/reg ...