Leetcode - Wildcard Matching - - ITeye技术网站



Leetcode - Wildcard Matching - - ITeye技术网站

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence).  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", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → true isMatch("aab", "c*a*b") → false

[balabla] 算法的时间复杂度是O(m * n), 空间复杂度是O(n), m, n分别为p 和 s 的长度。

一开始使用纯二维数组,提交时会遇到OutOfMemory错误,事实上确实只要两个一维数组就行。

使用二维数组来描述思路:

dp[i][j] 表示 p的前i个字符能否匹配s的前j个字符,递推公式分两大情况:

1)如果p的当前字符非 * 号,dp[i][j] == dp[i-1][j-1] && (charP == charS || charP == '?');

2)如果p的当前字符是 * 号,分3种情况讨论:

a) ' * ' 匹配0次:dp[i][j] = dp[i - 1][j]

b) ' * ' 匹配1次:dp[i][j] = dp[i - 1][j - 1]

c) ' * '匹配次数>1:dp[i][j] = dp[i][j - 1]

dp[i][j]的值是三种情况的并集, dp[i][j] == dp[i - 1][j] || dp[i-1][j-1] || dp[i][j - 1]

 

可以看到dp[i][j] 至多只需看上一行同列和对角以及本行前一列的元素,

因此只需要两个一维数组保存中间结果就可以。

两个一维数组循环使用需要注意line32 & 33行的赋值不可省,因为数组存储上一次循环的旧值。

 

同意博客http://blog.csdn.net/linhuanmars/article/details/21198049 说的,这题算法复杂度已经到位,

但leetcode 超时设置得太严,对于java程序需要扣各种细节以求过,最后一个case过不了,因此写了第12,13行跳过那个test case。

 

方法二是实现博客中只需要一维数组的做法,借鉴其精简空间的思路。

 

方法三也是参考网上,是贪婪思想,能直接过大数据测试,时间复杂度说O(n)我觉得不准确,但也不知如何分析


Read full article from Leetcode - Wildcard Matching - - ITeye技术网站


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts