Wildcard Matching

最后更新于:2022-04-01 22:58:14

**一. 题目描述** 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 ~~~ **二. 题目分析** 题目的大意是,给出两串字符串`s`和`p`,规定符号`?`能匹配任意单个字符,`*`能匹配任意字符序列(包括空字符序列)。如果两串字符串完全匹配则返回`true`。 该题的难点主要在于出现`*`时的匹配操作。和网上大多数做法相似,一开始使用递归完成,结果总是超时。后来使用几个变量用于记录遇到`p`中的`*`时的下标,每次遇到一个`*`,就保留住当前字符串`s`和`p`的下标,然后s从当前下标往后扫描,如果不匹配,则s的下标加一,重复扫描。 **三. 示例代码** ~~~ #include #include using namespace std; class Solution { public: bool isMatch(string s, string p) { int s_size = s.size(); int p_size = p.size(); int s_index = 0, p_index = 0; int temp_s_index = -1, temp_p_index = -1; while (s_index < s_size) { if (p[p_index] == '?' || p[p_index] == s[s_index]) { ++p_index; ++s_index; continue; } if (p[p_index] == '*') { temp_p_index = p_index; temp_s_index = s_index; ++p_index; continue; } if (temp_p_index >= 0) { // 字符串p可能有多个*,因此只要出现过*,则需要更新当前匹配的下标 p_index = temp_p_index + 1; s_index = temp_s_index + 1; // 当前坐标s与p不匹配,则s的坐标在原基础上加一,继续循环 ++temp_s_index; continue; } return false; } while (p[p_index] == '*') ++p_index; return p_index == p_size; } }; ~~~ **四. 小结** 这种题目一般递归的思路还是首选,但递归的最大缺点就是耗时。该题若使用动态规划也可以解决,但是未必能达到以上方法的
';