Pattern Matching: You are given two strings, pattern
and value
.The pattern
string consists of just the letters a
and b
, describing a pattern within a string. For example, the string catcatgocatgo
matches the pattern aabab
(where cat
is a
and go
is b
). It also matches patterns like a
, ab
, and b
. Write a method to determine if value matches pattern.
Hints: #631, #643, #653, #663, #685, #718, #727
解法
理解一下题意:
|
|
看一下Pattern 3 ab
,其实只要在字符串中间切一刀,只要两边不相同就能够匹配ab
。所以这个问题不是对单词(word)的模式匹配。
看Pattern 2 a
和Pattern 4 b
,这就说明a
和b
其实是等价的。
看Pattern 1aabab
,前面已经说了这个问题不是对word的模式匹配,那么是如何得到a=cat
、b=go
的呢?
我们可以逐步检验Pattern,我们可以先看第一个a
,那么Pattern实际上就变成了a|abab
。然后我们开始猜测a:
|
|
我们可以先用第一个选择,把a=c
,然后就看Pattern的第二个a|bab
,检验atcatgocatgo
,因为已知a=c
,这个就很好检验,发现检验结果失败。
然后以此类推。这个过程可以描述为:
|
|
代码:
|
|
时间复杂度:太复杂,计算不出来。
解法2(更好)
还是看这个:
|
|
我们可以看到a
有3个,b
有2个,Value的长度为13,那么可以知道a
的最长的长度是13 / 3 = 4
,因此可以缩小a
的取值范围,b
的长度则等于(13 - 3 * a) / 2
。可以依此猜测a
和b
的值,然后看是否匹配。
代码:
|
|
时间复杂度:
- 尝试所有main的可能性为n次(n为value的长度),即n个循环。每个循环里:
- 构建预期字符串的循环为m次(m为pattern的长度)
- 判断预期字符串和value是否相等的复杂度为O(n)(n为value的长度)
- 所以时间复杂度为O(n2),最坏情况下m=n。
评论