Welcome to Subscribe On Youtube
3407. Substring Matching Pattern
Description
You are given a string s
and a pattern string p
, where p
contains exactly one '*'
character.
The '*'
in p
can be replaced with any sequence of zero or more characters.
Return true
if p
can be made a substring of s
, and false
otherwise.
Example 1:
Input: s = "leetcode", p = "ee*e"
Output: true
Explanation:
By replacing the '*'
with "tcod"
, the substring "eetcode"
matches the pattern.
Example 2:
Input: s = "car", p = "c*v"
Output: false
Explanation:
There is no substring matching the pattern.
Example 3:
Input: s = "luck", p = "u*"
Output: true
Explanation:
The substrings "u"
, "uc"
, and "uck"
match the pattern.
Constraints:
1 <= s.length <= 50
1 <= p.length <= 50
s
contains only lowercase English letters.p
contains only lowercase English letters and exactly one'*'
Solutions
Solution 1
-
class Solution { public boolean hasMatch(String s, String p) { int i = 0; for (String t : p.split("\\*")) { int j = s.indexOf(t, i); if (j == -1) { return false; } i = j + t.length(); } return true; } }
-
class Solution { public: bool hasMatch(string s, string p) { int i = 0; int pos = 0; int start = 0, end; while ((end = p.find("*", start)) != string::npos) { string t = p.substr(start, end - start); pos = s.find(t, i); if (pos == string::npos) { return false; } i = pos + t.length(); start = end + 1; } string t = p.substr(start); pos = s.find(t, i); if (pos == string::npos) { return false; } return true; } };
-
class Solution: def hasMatch(self, s: str, p: str) -> bool: i = 0 for t in p.split("*"): j = s.find(t, i) if j == -1: return False i = j + len(t) return True
-
func hasMatch(s string, p string) bool { i := 0 for _, t := range strings.Split(p, "*") { j := strings.Index(s[i:], t) if j == -1 { return false } i += j + len(t) } return true }
-
function hasMatch(s: string, p: string): boolean { let i = 0; for (const t of p.split('*')) { const j = s.indexOf(t, i); if (j === -1) { return false; } i = j + t.length; } return true; }