leetcode -- Wildcard Matching --再看
来源:互联网 发布:黑马协议软件微信站街 编辑:程序博客网 时间:2024/06/06 16:45
https://leetcode.com/problems/wildcard-matching/
参考:http://www.cnblogs.com/zuoyuan/p/3781872.html
http://yucoding.blogspot.hk/2013/02/leetcode-question-123-wildcard-matching.html
用two pointers的方法.
这里概括的说就是如果在p中遇到star则用star 记录p中的star位置,并记录其对应的被匹配的s元素的位置为match,然后p_cur往前走一步而s_cur不往前走,因为可以匹配empty。然后如果s_cur和p_cur如果对应元素不相等,那么就看看star是否有值,有的话,那么p_cur退回到star + 1, 然后s_cur退回到match + 1, 并且这里match还要自己加1,相当于暂时认为star位置上的’‘匹配了其原来match上的元素,然后继续p_cur和s_cur往前进。
用s = ‘sbbc’ p = ‘*abd’来举例
For each element in s
If *s==*p or *p == ? which means this is a match, then goes to next element s++ p++.
If p==’‘, this is also a match, but one or many chars may be available, so let us save this ’s position and the matched s position.
If not match, then we check if there is a * previously showed up,
if there is no *, return false;
if there is an , we set current p to the next element of (*的下一个element), and set current s to the next saved s position (save s position的下一个element).
e.g.
abed
?b*d**
a=?, go on, b=b, go on,
e=, save position star=3, save s position ss = 3, p++
e!=d, check if there was a *, yes, ss++, s=ss; p=star+1
d=d, go on, meet the end.
check the rest element in p, if all are *, true, else false;
class Solution: # @param s, an input string # @param p, a pattern string # @return a boolean def isMatch(self, s, p): s_cur = 0; p_cur= 0; match = 0; star = -1; while s_cur<len(s):#p比s短没关系,如果p只有一个*,那么 if p_cur< len(p) and (s[s_cur]==p[p_cur] or p[p_cur]=='?'): s_cur = s_cur + 1 p_cur = p_cur + 1 elif p_cur<len(p) and p[p_cur]=='*': match = s_cur#被*match的position star = p_cur#*的position,如果有很多*,那么只save最近的那个 p_cur = p_cur+1#这里s_cur不变的原因是,*可以包括empty elif (star!=-1): p_cur = star+1 match = match+1#这里一定要注意match也要自己增加1,相当于star和match已经匹配成功了 s_cur = match else: return False while p_cur<len(p) and p[p_cur]=='*': p_cur = p_cur+1 if p_cur==len(p): return True else: return False
自己重写code
容易忘记while条件是什么,这里是ps < len(s),因为是匹配s的letter,所以要把s scan完. 但是pp要往前进的时候,也要判断是否越界即pp < len(p).
class Solution(object): def isMatch(self, s, p): """ :type s: str :type p: str :rtype: bool """ if len(p) == 0 and len(s) != 0: return False if len(p) == 0 and len(s) == 0: return True ps, pp = 0, 0 star, match = -1, 0 while ps < len(s): if pp < len(p) and (s[ps] == p[pp] or p[pp] == '?'): ps += 1 pp += 1 elif pp < len(p) and p[pp] == '*': star = pp match = ps pp += 1 elif star != -1: pp = star + 1 match += 1 ps = match else: return False while pp < len(p) and p[pp] == '*': pp += 1 if pp == len(p): return True else: return False
- leetcode -- Wildcard Matching --再看
- LeetCode: Wildcard Matching
- LeetCode : Wildcard Matching
- [LeetCode] Wildcard Matching - Iteratively
- leetcode 83: Wildcard Matching
- [Leetcode] Wildcard Matching
- [LeetCode]Wildcard Matching
- LeetCode-Wildcard Matching
- LeetCode -- Wildcard Matching
- LeetCode | Wildcard Matching
- Leetcode: Wildcard Matching
- Leetcode:Wildcard Matching
- LeetCode题解:Wildcard Matching
- LeetCode Wildcard Matching
- [Leetcode] Wildcard Matching (Java)
- LeetCode OJ:Wildcard Matching
- Leetcode: Wildcard Matching
- Wildcard Matching -- LeetCode
- HDOJ 1286 找新朋友
- Groovy入门教程
- 软件架构学习小结
- LeetCode 12 - Integer to Roman
- 数据结构制冒泡排序算法—PHP
- leetcode -- Wildcard Matching --再看
- NSDictionary之objectForKey 和 valueForKey 的不同
- 第四章 Controller接口控制器详解(1)
- iOS面试题
- [置顶] Linux 精萃
- 应用系统架构设计
- 第四章 Controller接口控制器详解(2)
- Android初学习 - Activity的四种启动模式(回退栈)
- codeforces 424C. Magic Formulas (异或规律)