解题思路
使用正则表达式解决匹配问题:
- 将B串中的'?'转换为正则表达式[01]
- 使用HashSet去重存储匹配的子串
- 统计不同匹配的数量
关键点
- 正则表达式构建
- 子串匹配
- 使用Set去重
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(string& A, string& B) {
// 构建正则表达式模式
string pattern;
for (char c : B) {
if (c == '?') {
pattern += "[01]";
} else {
pattern += c;
}
}
// 存储所有可能的匹配结果
unordered_set<string> st;
// 遍历所有可能的子串
for (int i = 0; i <= A.length() - B.length(); i++) {
string sub = A.substr(i, B.length());
bool match = true;
// 手动匹配模式
for (int j = 0; j < B.length(); j++) {
if (B[j] == '?' || B[j] == sub[j]) continue;
match = false;
break;
}
if (match) st.insert(sub);
}
return st.size();
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string A, B;
getline(cin, A);
getline(cin, B);
Solution sol;
cout << sol.solve(A, B) << endl;
return 0;
}
import java.util.*;
public class Main {
static class Solution {
public int solve(String A, String B) {
// 存储所有可能的匹配结果
Set<String> st = new HashSet<>();
// 遍历所有可能的子串
for (int i = 0; i <= A.length() - B.length(); i++) {
String sub = A.substring(i, i + B.length());
boolean match = true;
// 手动匹配模式
for (int j = 0; j < B.length(); j++) {
if (B.charAt(j) == '?' || B.charAt(j) == sub.charAt(j)) continue;
match = false;
break;
}
if (match) st.add(sub);
}
return st.size();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String A = sc.nextLine();
String B = sc.nextLine();
Solution sol = new Solution();
System.out.println(sol.solve(A, B));
sc.close();
}
}
class Solution:
def solve(self, A: str, B: str) -> int:
# 存储所有可能的匹配结果
st = set()
# 遍历所有可能的子串
for i in range(len(A) - len(B) + 1):
sub = A[i:i + len(B)]
match = True
# 手动匹配模式
for j in range(len(B)):
if B[j] == '?' or B[j] == sub[j]:
continue
match = False
break
if match:
st.add(sub)
return len(st)
def main():
A = input().strip()
B = input().strip()
sol = Solution()
print(sol.solve(A, B))
if __name__ == "__main__":
main()
算法及复杂度
- 算法:字符串匹配 + 集合去重
- 时间复杂度:, 为 长度, 为 长度
- 空间复杂度:, 为不同匹配的子串数量