解题思路

使用正则表达式解决匹配问题:

  1. 将B串中的'?'转换为正则表达式[01]
  2. 使用HashSet去重存储匹配的子串
  3. 统计不同匹配的数量

关键点

  1. 正则表达式构建
  2. 子串匹配
  3. 使用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()

算法及复杂度

  • 算法:字符串匹配 + 集合去重
  • 时间复杂度: 长度, 长度
  • 空间复杂度: 为不同匹配的子串数量