校招算法笔面试 | 校招笔面试真题-字符串通配

题目## 题目## 题目

题目链接

解题思路

这是一个字符串匹配问题,可以使用动态规划来解决。关键点:

  1. 状态定义

    • d p [ i ] [ j ] dp[i][j] dp[i][j] 表示字符串 A A A 的前 i i i 个字符是否能被字符串 B B B 的前 j j j 个字符匹配。
  2. 状态转移

    • 如果当前字符匹配( A [ i − 1 ] = = B [ j − 1 ] A[i-1] == B[j-1] A[i1]==B[j1] 或 $B[j-1] == ‘.’),则:
      • d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i1][j1]
    • 如果 B [ j − 1 ] B[j-1] B[j1] 是 ‘*’,则:
      • d p [ i ] [ j ] = d p [ i ] [ j − 2 ] dp[i][j] = dp[i][j-2] dp[i][j]=dp[i][j2] // '*'表示前一个字符出现0次
      • d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i1][j] // '*'表示前一个字符出现1次或多次(前一个字符必须与A[i-1]匹配)
  3. 初始化

    • d p [ 0 ] [ 0 ] = t r u e dp[0][0] = true dp[0][0]=true,表示两个空字符串匹配。
    • 处理 B B B 中 ‘*’ 的情况,初始化 d p [ 0 ] [ j ] dp[0][j] dp[0][j]

代码

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class WildMatch {
   
   
public:
    bool chkWildMatch(string A, int lena, string B, int lenb) {
   
   
        vector<vector<bool>> dp(lena + 1, vector<bool>(lenb + 1, false));
        dp[0][0] = true;  // 两个空字符串匹配
        
        // 初始化B的情况
        for (int j = 1; j <= lenb; j++) {
   
   
            if (B[j - 1] == '*') {
   
   
                dp[0][j] = dp[0][j - 2];  // '*'表示前一个字符出现0次
            }
        }
        
        // 动态规划填表
        for (int i = 1; i <= lena; i++) {
   
   
            for (int j = 1; j <= lenb; j++) {
   
   
                if (A[i - 1] == B[j - 1] || B[j - 1] == '.') {
   
   
                    dp[i][j] = dp[i - 1][j - 1];  // 当前字符匹配
                } else if (B[j - 1] == '*') {
   
   
                    dp[i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值