当前位置:网站首页>[leetcode] wild card matching
[leetcode] wild card matching
2022-07-05 11:28:00 【Full stack programmer webmaster】
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") → falseThe wildcard matching problem of this problem is still a little difficult , Greedy algorithm is used in this road Greedy Alogrithm To solve , Because of the special characters * and ?, among ? Can replace any character ,* Can replace any string , Then we need to define several additional pointers , among scur and pcur Respectively point to the currently traversed characters , Redefine pstar Point to p Last of * The location of ,sstar Point to the corresponding s The location of , The specific algorithm is as follows :
– Definition scur, pcur, sstar, pstar
– If *scur There is
– If *scur be equal to *pcur perhaps *pcur by ‘?’, be scur and pcur All increase by themselves 1
– If *pcur by ’*’, be pstar Point to pcur Location ,pcur Self increasing 1, And sstar Point to scur
– If pstar There is , be pcur Point to pstar Next position of ,scur Point to sstar Self increasing 1 The back position
– If pcur by ’*’, be pcur Self increasing 1
– if *pcur There is , return False, If it does not exist , return True
C Solution 1 :
bool isMatch(char *s, char *p) {
char *scur = s, *pcur = p, *sstar = NULL, *pstar = NULL;
while (*scur) {
if (*scur == *pcur || *pcur == '?') {
++scur;
++pcur;
} else if (*pcur == '*') {
pstar = pcur++;
sstar = scur;
} else if (pstar) {
pcur = pstar + 1;
scur = ++sstar;
} else return false;
}
while (*pcur == '*') ++pcur;
return !*pcur;
}This problem can also be solved by dynamic programming Dynamic Programming To solve , The writing method is the same as the previous question Regular Expression Matching It's like , But it's still different . The biggest difference between wild card matching and regular matching is in the rules of using asterisks , For regular matching , The asterisk cannot exist alone , It must be preceded by a character , The meaning of the asterisk is to indicate that the number of characters in front of it can be any , Include 0 individual , That is to say, even if the previous character is not in s It doesn't matter if it appears in , As long as the latter can match . This is not the case with external card matching , The asterisk in the wild card matching has nothing to do with the previous character , If the preceding characters do not match , Then go straight back false 了 , Never mind the asterisk . The function of the asterisk is to represent any string , Of course, it only works when the matching string is missing some characters , When the matching string contains characters that the target string does not , Will not match successfully .
C++ Solution 2 :
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size(), n = p.size();
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
dp[0][0] = true;
for (int i = 1; i <= n; ++i) {
if (p[i - 1] == '*') dp[0][i] = dp[0][i - 1];
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (p[j - 1] == '*') {
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
} else {
dp[i][j] = (s[i - 1] == p[j - 1] || p[j - 1] == '?') && dp[i - 1][j - 1];
}
}
}
return dp[m][n];
}
};Similar topics :
Reference material :
https://discuss.leetcode.com/topic/3040/linear-runtime-and-constant-space-solution
https://discuss.leetcode.com/topic/40118/clear-c-dp-solution-similar-to-the-last-matching-problem
LeetCode All in One Summary of topic explanation ( Ongoing update …)
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/109497.html Link to the original text :https://javaforall.cn
边栏推荐
- 居家办公那些事|社区征文
- Detailed explanation of MATLAB cov function
- 阻止瀏覽器後退操作
- FreeRTOS 中 RISC-V-Qemu-virt_GCC 的调度时机
- 力扣(LeetCode)185. 部门工资前三高的所有员工(2022.07.04)
- OneForAll安装使用
- Ddrx addressing principle
- COMSOL--建立几何模型---二维图形的建立
- AutoCAD -- mask command, how to use CAD to locally enlarge drawings
- Intelligent metal detector based on openharmony
猜你喜欢

COMSOL -- establishment of geometric model -- establishment of two-dimensional graphics

Differences between IPv6 and IPv4 three departments including the office of network information technology promote IPv6 scale deployment

7 大主题、9 位技术大咖!龙蜥大讲堂7月硬核直播预告抢先看,明天见

How can China Africa diamond accessory stones be inlaid to be safe and beautiful?

7 themes and 9 technology masters! Dragon Dragon lecture hall hard core live broadcast preview in July, see you tomorrow

R3Live系列学习(四)R2Live源码阅读(2)

In the last process before the use of the risk control model, 80% of children's shoes are trampled here

pytorch训练进程被中断了

R3live series learning (IV) r2live source code reading (2)

龙蜥社区第九次运营委员会会议顺利召开
随机推荐
SET XACT_ABORT ON
PHP中Array的hash函数实现
[JS learning notes 54] BFC mode
shell脚本文件遍历 str转数组 字符串拼接
如何将 DevSecOps 引入企业?
跨境电商是啥意思?主要是做什么的?业务模式有哪些?
Redis如何实现多可用区?
COMSOL -- establishment of 3D graphics
Mysql统计技巧:ON DUPLICATE KEY UPDATE用法
comsol--三维图形随便画----回转
How does redis implement multiple zones?
COMSOL -- 3D casual painting -- sweeping
ibatis的动态sql
百问百答第45期:应用性能探针监测原理-node JS 探针
c#操作xml文件
Cdga | six principles that data governance has to adhere to
Ziguang zhanrui's first 5g R17 IOT NTN satellite in the world has been measured on the Internet of things
How to make full-color LED display more energy-saving and environmental protection
COMSOL--三维随便画--扫掠
Summary of thread and thread synchronization under window