牛客题解 | 正则表达式匹配

题目

题目链接

解题思路

这是一个动态规划问题,需要考虑多种匹配情况:

  1. 定义 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 s t r str str 的前 i i i 个字符和 p a t t e r n pattern pattern 的前 j j j 个字符是否匹配
  2. 对于 p a t t e r n [ j − 1 ] pattern[j-1] pattern[j1] 的不同情况:
    • 如果是普通字符:需要 s t r [ i − 1 ] = = p a t t e r n [ j − 1 ] str[i-1] == pattern[j-1] str[i1]==pattern[j1]
    • 如果是’.':可以匹配任意字符
    • 如果是’*':可以匹配0次或多次前面的字符
  3. 对于’*'的情况需要考虑:
    • 匹配 0 0 0 次: d p [ i ] [ j ] = d p [ i ] [ j − 2 ] dp[i][j] = dp[i][j-2] dp[i][j]=dp[i][j
### C++ 中处理后缀表达式的解析与实现 #### 解析原理 后缀表达式,又称逆波兰表示法,是一种不需要括号来表示操作顺序的算术表达式形式。这种表达方式使得计算机更容易理解和计算复杂的数学表达式。 对于给定的一个字符串类型的后缀表达式,在C++中可以通过栈这一数据结构来进行求解。具体来说,当遇到数字时将其压入栈内;而一旦碰到运算符,则弹出相应数量的操作数执行该运算,并把结果重新压回栈中等待后续可能存在的进一步计算直到整个过程结束只留下最终的结果于栈底[^1]。 #### 实现代码示例 以下是基于上述逻辑编写的用于评估简单四则运算(加减乘除)组成的后缀表达式的函数: ```cpp #include <iostream> #include <stack> #include <sstream> using namespace std; // 计算两个数值之间的基本运算 double calculate(double a, double b, char op){ switch(op){ case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if(b != 0) return a / b; else { cout << "Error: Division by zero!" << endl; exit(1); } } } int main(){ string expression = "34+"; // 示例输入:3 + 4 stack<double> numStack; stringstream ss(expression); string token; while(ss >> token){ if(isdigit(token[0])){ numStack.push(stod(token)); }else{ double operand2 = numStack.top();numStack.pop(); double operand1 = numStack.top();numStack.pop(); char operation = token[0]; double result = calculate(operand1, operand2, operation); numStack.push(result); } } cout << "Result of the postfix expression is : " << numStack.top() << endl; return 0; } ``` 此程序能够读取由空格分隔开来的单字符或多位整数构成的后缀表达式,并对其进行求值输出。注意这里假设所有的输入都是有效的并且至少含有一个二元运算。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值