String - 44. Wildcard Matching
时间:2022-07-25
本文章向大家介绍String - 44. Wildcard Matching,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- Wildcard Matching
Given an input string (s
) and a pattern (p
), 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).
Note:
-
s
could be empty and contains only lowercase lettersa-z
. -
p
could be empty and contains only lowercase lettersa-z
, and characters like?
or*
.
Example 1:
Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".
Example 2:
Input:
s = "aa"
p = "*"
Output: true
Explanation: '*' matches any sequence.
Example 3:
Input:
s = "cb"
p = "?a"
Output: false
Explanation: '?' matches 'c', but the second letter is 'a', which does not match 'b'.
Example 4:
Input:
s = "adceb"
p = "*a*b"
Output: true
Explanation: The first '*' matches the empty sequence, while the second '*' matches the substring "dce".
Example 5:
Input:
s = "acdcb"
p = "a*c?b"
Output: false
思路:
题目意思是实现一个模式串匹配,
*
可以代表任意个字符,?
可以代表任意一个字符,让实现p串能否匹配s串。很难的一道题,如果没有做过,非常难想出最优解。做法就是使用四个指针,两个探索指针,两个标志位指针来遍历s串
和p 串
。
代码:
go:
func isMatch(s string, p string) bool {
var (
sp = 0 // s串的探索指针
pp = 0 // p串的探索指针
matchPos = 0 // 记录p串发现"*"时,s串的sp走到的位置
star = -1 // 记录p串的“*”的位置
)
for sp < len(s) {
// 如果p串和s串匹配,或者p串有“?”两个指针都往后移动
if pp < len(p) && (s[sp] == p[pp] || p[pp] == '?') {
pp++
sp++
// 如果发现p串有“*”,则记录下“*”的位置以及s匹配到的位置,并且p串的探索指针往后移动
} else if pp < len(p) && p[pp] == '*' {
star = pp
matchPos = sp
pp++
// 如果在p串已经发现有“*”,那么就把p串探索指针更新到“*”的后面,
// 同时从发现“*”的时候的s串的探索指针sp往后移动,继续后面的匹配
} else if star != -1 { // 发现p有*
pp = star + 1
sp = matchPos
sp++
// 否则就不能匹配,直接返回false
} else {
return false
}
}
// 检查p串是否走完
for pp < len(p) && p[pp] == '*' {
pp++
}
return pp == len(p)
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 牛客网-反转链表
- 牛客网-替换空格
- 手把手教你破解文件密码、wifi密码、网页密码
- 如何安装 Elastic 栈中的 Logstash
- 你的GitHub项目被封存到北极了吗?
- Logstash: 如何创建可维护和可重用的 Logstash 管道
- 手把手教你微信好友头像形成指定的文字
- Logstash: 应用实践 - 装载 CSV 文档到 Elasticsearch
- LeetCode 剑指 Offer 28. 对称的二叉树
- Mysql拼接查询结果
- 手把手教你如何重建二叉树(超精彩配图)
- 一文搞定插入排序算法
- LeetCode 107. 二叉树的层次遍历 II
- LeetCode 103. 二叉树的锯齿形层次遍历
- 我是怎么一步一步调试出来二叉树的遍历(超精彩配图),二叉树遍历再也不用愁了