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。
评论