The pattern p contains exactly one *, which can match any sequence (including empty) of characters. We can split p into a prefix (before *) and a suffix (after *). For p to match a substring of s, there must exist a substring in s that starts with the prefix and ends with the suffix, with any (possibly empty) string in between.
classSolution {
public:bool matchSubstring(string s, string p) {
int star = p.find('*');
string pre = p.substr(0, star);
string suf = p.substr(star +1);
int n = s.size(), m = pre.size(), k = suf.size();
for (int i =0; i + m + k <= n; ++i) {
if (s.substr(i, m) == pre && s.substr(i + m + (n - i - m - k), k) == suf) {
// Actually, we need to check all substrings of length >= m + k
for (int len = m + k; i + len <= n; ++len) {
if (s.substr(i, m) == pre && s.substr(i + len - k, k) == suf)
return true;
}
}
}
return false;
}
};
// Leetcode signature:
// bool matchSubstring(string s, string p);
classSolution {
publicbooleanmatchSubstring(String s, String p) {
int star = p.indexOf('*');
String pre = p.substring(0, star);
String suf = p.substring(star + 1);
int n = s.length(), m = pre.length(), k = suf.length();
for (int i = 0; i <= n - m - k; i++) {
for (int len = m + k; i + len <= n; len++) {
if (s.substring(i, i + m).equals(pre) && s.substring(i + len - k, i + len).equals(suf)) {
returntrue;
}
}
}
returnfalse;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
funmatchSubstring(s: String, p: String): Boolean {
val star = p.indexOf('*')
val pre = p.substring(0, star)
val suf = p.substring(star + 1)
val n = s.length; val m = pre.length; val k = suf.length
for (i in0..n - m - k) {
for (len in m + k..n - i) {
if (s.substring(i, i + m) == pre && s.substring(i + len - k, i + len) == suf) {
returntrue }
}
}
returnfalse}
1
2
3
4
5
6
7
8
9
10
defmatchSubstring(s: str, p: str) -> bool:
star = p.index('*')
pre = p[:star]
suf = p[star+1:]
n, m, k = len(s), len(pre), len(suf)
for i in range(n - m - k +1):
for l in range(m + k, n - i +1):
if s[i:i+m] == pre and s[i+l-k:i+l] == suf:
returnTruereturnFalse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pubfnmatch_substring(s: String, p: String) -> bool {
let star = p.find('*').unwrap();
let pre =&p[..star];
let suf =&p[star+1..];
let n = s.len();
let m = pre.len();
let k = suf.len();
for i in0..=n - m - k {
for l in m + k..=n - i {
if&s[i..i+m] == pre &&&s[i+l-k..i+l] == suf {
returntrue;
}
}
}
false}