- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
正在处理以下模式匹配问题。并贴出详细的问题陈述和代码。该代码正在运行。在下面的实现中,它在外循环中循环模式,然后在内部循环中匹配源字符串——以构建二维 DP 表。
我的问题是,如果我更改实现,哪个外循环用于匹配源字符串,而内循环用于匹配模式。会有任何性能提升或任何功能缺陷吗?任何关于哪种口味更好或几乎相同的建议都将受到赞赏。
更具体地说,我的意思是从下面更改循环(对循环内容使用类似的逻辑),
for i in range(1, len(p) + 1):
for j in range(1, len(s) + 1):
到,
for i in range(1, len(s) + 1):
for j in range(1, len(p) + 1):
问题陈述
'.' Matches any single character.
'*' Matches zero or more of the preceding element.The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
class Solution(object):
def isMatch(self, s, p):
# The DP table and the string s and p use the same indexes i and j, but
# table[i][j] means the match status between p[:i] and s[:j], i.e.
# table[0][0] means the match status of two empty strings, and
# table[1][1] means the match status of p[0] and s[0]. Therefore, when
# refering to the i-th and the j-th characters of p and s for updating
# table[i][j], we use p[i - 1] and s[j - 1].
# Initialize the table with False. The first row is satisfied.
table = [[False] * (len(s) + 1) for _ in range(len(p) + 1)]
# Update the corner case of matching two empty strings.
table[0][0] = True
# Update the corner case of when s is an empty string but p is not.
# Since each '*' can eliminate the charter before it, the table is
# vertically updated by the one before previous. [test_symbol_0]
for i in range(2, len(p) + 1):
table[i][0] = table[i - 2][0] and p[i - 1] == '*'
for i in range(1, len(p) + 1):
for j in range(1, len(s) + 1):
if p[i - 1] != "*":
# Update the table by referring the diagonal element.
table[i][j] = table[i - 1][j - 1] and \
(p[i - 1] == s[j - 1] or p[i - 1] == '.')
else:
# Eliminations (referring to the vertical element)
# Either refer to the one before previous or the previous.
# I.e. * eliminate the previous or count the previous.
# [test_symbol_1]
table[i][j] = table[i - 2][j] or table[i - 1][j]
# Propagations (referring to the horizontal element)
# If p's previous one is equal to the current s, with
# helps of *, the status can be propagated from the left.
# [test_symbol_2]
if p[i - 2] == s[j - 1] or p[i - 2] == '.':
table[i][j] |= table[i][j - 1]
return table[-1][-1]
提前致谢,林
最佳答案
如果交换循环,i
将是 s
的索引,而 j
将是 p< 的索引
。您需要在循环中的任何地方交换 i
和 j
。
for i in range(1, len(s) + 1):
for j in range(1, len(p) + 1):
if p[j - 1] != "*":
# Update the table by referring the diagonal element.
table[j][i] = table[j - 1][i - 1] and \
(p[j - 1] == s[i - 1] or p[j - 1] == '.')
else:
# Eliminations (referring to the vertical element)
# Either refer to the one before previous or the previous.
# I.e. * eliminate the previous or count the previous.
# [test_symbol_1]
table[j][i] = table[j - 2][i] or table[j - 1][i]
# Propagations (referring to the horizontal element)
# If p's previous one is equal to the current s, with
# helps of *, the status can be propagated from the left.
# [test_symbol_2]
if p[j - 2] == s[i - 1] or p[j - 2] == '.':
table[j][i] |= table[j][i - 1]
原始算法逐行填充 table
(第一行 1,然后是 2、3,...)。交换后,表格将逐列填充(首先是第 1 列,然后是 2、3、...)。
算法的思想保持不变,因为 table
中的每个元素都是通过前一列或行上的元素定义的——不管你是逐行计算的,你已经计算过的元素或逐列。
具体来说,table[j][i]
是通过上一列table[j-1][i-1]
的对角线元素定义的;或前面行和/或列中的元素 table[j-2][i]
、table[j-1][i]
和/或 表[j][i-1]
.
因此,交换后的性能是一样的。在这两个版本中,table
元素的每次计算都需要一个常数时间。构建表
的总时间是O(len(s) * len(p))
。
交换后功能也是一样的。基本上,如果原始版本是正确的,那么修改后的版本也是正确的。原始的是否正确是另一回事......
让我们看一下原始版本。乍一看,i = 1
时似乎有两个地方存在索引问题:table[i - 2][j]
和 p[i - 2 ]
。
但是,Python 将索引 -1
解释为最后一个元素。因此,table[-1][j]
引用了 table
的最后一行,其中所有元素都是 False
。所以,table[1][j] = table[-1][j] 或 table[0][j]
等同于 table[1][j] = table[0 ][j]
.
对于 p[-1]
,请注意,当 p[0] = *
时,您只能在 if
语句中访问它(这对匹配没有意义)。 p[-1]
的值是多少并不重要,因为它不会影响 table[i][j]
的值。看一下:如果 if
语句的结果恰好是 True
,我们知道 table[1][0]
最初是False
,所以 table[1][1]
, table[1][2]
, ... 也必须是 False
。换句话说,p[0] = *
不会匹配任何字符串。
关于python - 模式匹配动态规划的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34165031/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!