[LeetCode]--44. Wildcard Matching
来源:互联网 发布:制作小视频的软件 编辑:程序博客网 时间:2024/04/27 19:01
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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "*") → trueisMatch("aa", "a*") → trueisMatch("ab", "?*") → trueisMatch("aab", "c*a*b") → false
Let’s see the answer!
public class Solution { public boolean isMatch(String str, String pattern) { int s = 0, p = 0, match = 0, starIdx = -1; while (s < str.length()) { // case that: str[s] == pattern[p] or pattern[p] == '?' if (p < pattern.length() && (pattern.charAt(p) == '?' || str.charAt(s) == pattern.charAt(p))) { s++; p++; } // case that * found, only advance the pattern pointer. else if (p < pattern.length() && pattern.charAt(p) == '*') { starIdx = p; match = s; p++; } // case that pattern[p] != str[s] && pattern[p] != '?' && pattern[p] != '*', that // means la else if (starIdx != -1) { p = starIdx + 1; match++; s = match; } // case that current pattern pointer is not *, and last pointer was not * either. So, don't match. else return false; } // Let's check for remaining character in pattern while (p < pattern.length() && pattern.charAt(p) == '*') { p++; } return p == pattern.length(); }}
Dynamic Programing
Can also solvle it with DP method!
1. Python Code
class Solution: # @param s, an input string # @param p, a pattern string # @return a boolean def isMatch(self, s, p): m,n = len(s),len(p) cnt =p.count('*') if n - cnt > m: return False dp=[True] + [False]*n for j in range(1,n+1): dp[j]= dp[j-1] and p[j-1]=='*' for i in range(1,m+1): cur=[False]*(n+1) for j in range(1,n+1): if p[j-1]=='*': cur[j]= cur[j-1] or dp[j] elif p[j-1]==s[i-1] or p[j-1]=='?': cur[j]=dp[j-1] dp=cur return dp[n]
- Java Code
public class Solution { public boolean isMatch(String s, String p) { int m = s.length(), n = p.length(); int count = 0; for (int i = 0; i < n; i++) { if (p.charAt(i) == '*') count++; } if (count==0 && m != n) return false; else if (n - count > m) return false; boolean[] match = new boolean[m+1]; match[0] = true; for (int i = 0; i < m; i++) { match[i+1] = false; } for (int i = 0; i < n; i++) { if (p.charAt(i) == '*') { for (int j = 0; j < m; j++) { match[j+1] = match[j] || match[j+1]; } } else { for (int j = m-1; j >= 0; j--) { match[j+1] = (p.charAt(i) == '?' || p.charAt(i) == s.charAt(j)) && match[j]; } match[0] = false; } } return match[m]; }}
Reference
- https://discuss.leetcode.com/topic/10794/my-java-dp-solution
- https://discuss.leetcode.com/topic/3040/linear-runtime-and-constant-space-solution
- https://www.hrwhisper.me/leetcode-regular-expression-matching-leetcode-wildcard-matching/
0 0
- LeetCode --- 44. Wildcard Matching
- [Leetcode] 44. Wildcard Matching
- Leetcode 44. Wildcard Matching
- leetcode 44. Wildcard Matching
- Leetcode 44. Wildcard Matching
- Leetcode:44. Wildcard Matching
- LeetCode 44. Wildcard Matching
- leetcode.44. Wildcard Matching
- LeetCode 44. Wildcard Matching
- Leetcode-44. Wildcard Matching
- [LeetCode] 44. Wildcard Matching
- [leetcode] 44. Wildcard Matching
- [LeetCode]--44. Wildcard Matching
- LeetCode 44. Wildcard Matching
- leetcode 44. Wildcard Matching
- LeetCode 44. Wildcard Matching
- 44. Wildcard Matching -- LeetCode
- LeetCode 44. Wildcard Matching
- java文件之数据流
- 用回车代替Tab键
- freemarker语法标签中括号
- 为什么有些大公司技术弱爆了?
- C语言之指针
- [LeetCode]--44. Wildcard Matching
- 数塔(数字三角形)
- build.prop参数详解和部分修改
- Heredoc和Nowdoc
- SharedPreferences的基本使用-----存,删,改,查
- iOS 使用class_copyPropertyList等runtime方法的注意事项
- linux_sound_alsa_ALSA体系SOC子系统中数据流分析
- 【记录】制作最小根文件系统
- php里的namespace及use的用法