Since the pattern has exactly two ‘’, we can split it into three parts: prefix, middle, and suffix. For each possible split in s, check if the prefix and suffix match, and the middle part (between the two ‘’) can be matched in order.
#include<string>#include<vector>usingnamespace std;
classSolution {
public:int shortestMatchingSubstring(string s, string p) {
int n = s.size(), m = p.size();
int a = p.find('*'), b = p.rfind('*');
string pre = p.substr(0,a), mid = p.substr(a+1,b-a-1), suf = p.substr(b+1);
vector<int> preEnd, sufStart;
// Prefix match
for (int i=0; i+pre.size()<=n; ++i) {
if (s.substr(i,pre.size())==pre) preEnd.push_back(i+pre.size()-1);
}
// Suffix match
for (int i=0; i+suf.size()<=n; ++i) {
if (s.substr(i,suf.size())==suf) sufStart.push_back(i);
}
int res =1e9;
for (int l:preEnd) for (int r:sufStart) if (l<r) {
// Check mid in s[l+1..r-1]
int i=l+1, j=0;
while (i<r && j<mid.size()) {
if (s[i]==mid[j]) ++j;
++i;
}
if (j==mid.size()) res = min(res, r-l+1);
}
if (pre.empty() && suf.empty() && mid.empty()) return0;
return res==1e9?-1:res;
}
};
import java.util.*;
classSolution {
publicintshortestMatchingSubstring(String s, String p) {
int n = s.length(), m = p.length();
int a = p.indexOf('*'), b = p.lastIndexOf('*');
String pre = p.substring(0,a), mid = p.substring(a+1,b), suf = p.substring(b+1);
List<Integer> preEnd =new ArrayList<>(), sufStart =new ArrayList<>();
for (int i=0; i+pre.length()<=n; ++i)
if (s.substring(i,i+pre.length()).equals(pre)) preEnd.add(i+pre.length()-1);
for (int i=0; i+suf.length()<=n; ++i)
if (s.substring(i,i+suf.length()).equals(suf)) sufStart.add(i);
int res = Integer.MAX_VALUE;
for (int l:preEnd) for (int r:sufStart) if (l<r) {
int i=l+1, j=0;
while (i<r && j<mid.length()) {
if (s.charAt(i)==mid.charAt(j)) ++j;
++i;
}
if (j==mid.length()) res = Math.min(res, r-l+1);
}
if (pre.isEmpty() && suf.isEmpty() && mid.isEmpty()) return 0;
return res==Integer.MAX_VALUE?-1:res;
}
}
classSolution:
defshortestMatchingSubstring(self, s: str, p: str) -> int:
a, b = p.find('*'), p.rfind('*')
pre, mid, suf = p[:a], p[a+1:b], p[b+1:]
n = len(s)
preEnd = [i+len(pre)-1for i in range(n-len(pre)+1) if s[i:i+len(pre)]==pre]
sufStart = [i for i in range(n-len(suf)+1) if s[i:i+len(suf)]==suf]
res = float('inf')
for l in preEnd:
for r in sufStart:
if l < r:
i, j = l+1, 0while i < r and j < len(mid):
if s[i]==mid[j]: j+=1 i+=1if j==len(mid):
res = min(res, r-l+1)
ifnot pre andnot suf andnot mid:
return0return-1if res==float('inf') else res