正则问题
题目描述
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。
输出格式
输出所给正则表达式能接受的最长字符串的长度。
数据范围
输入长度不超过100,保证合法。
样例
((xx|xxx)x|(x|xx))xx
样例输出
6
算法
时间复杂度 $O(n^2)$
主要思路
**比较菜,只能想到表达式那类问题的做法,于是按照表达式求值对括号的处理思路对本题进行求解
具体的思路就不说了,核心的思想是栈————遇到’)’则对当前括号进行处理,否则入栈
有几个要注意的地方:**
1. 不要忘了把左括号pop出来
2. 一个括号里可能有多个’|’,要选择合适的做法去得到当前括号最大长度
3. 最后要再count一次,因为可能此时栈里还有’|’
4. 最后栈的size,就是我们的答案了
C++ 代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<stack>
#include<algorithm>
using namespace std;
string str;
stack<char> stk;
void count(){
//统计现在这个括号里的最大值
//注意括号里可能没有'|'
//但也可能有多个'|'
int n1 = 0, max_n = 0;
while(stk.size() && stk.top() != '('){
char top_ch = stk.top();
stk.pop();
if(top_ch == 'x'){
n1++;
}else{
max_n = max(max_n, n1);
n1 = 0;
}
}
max_n = max(max_n, n1);
//cout << max_n << endl;
if(stk.size()) stk.pop();//把'('pop出来
//在push进去最多的*
for(int j = 0; j < max_n; j++){
stk.push('x');
}
}
int main(){
cin >> str;
int l = str.size();
for(int i = 0; i < l; i++){
int ch = str[i];
if(ch != ')'){
stk.push(ch);
}else{
count();
}
}
count();
cout << stk.size() << endl;
return 0;
}
我要顶自己hhhhhh
冲你这份自信,顶你一下。
这位老哥(大姐)算法有一个明显的瑕疵,就是每次求值后,会将一连串的 x 压回栈中,下次求值又反复弹出,导致时间开销为 O(n^2) 。受博主代码的启发,本菜狗进行了一点简单的优化,把每次求值后的子串使用一个整数来维护,于是时间代价就降低到 O(n)。代码如下:
佬
厉害啊
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
using namespace std;
string str;
char stk[110];
int top;
void count(){
int n1=0,max_n=0;
while(stk[top]!=0&&stk[top]!=’(‘){
char top_ch=stk[top];
top–;
if(top_ch==’x’){
n1++;
}
else{//’ ( | ‘
max_n=max(max_n,n1);
n1=0;//重新计数
}
}
if(stk[top]){
top–;//删除(
}
max_n=max(max_n,n1);
//之前清空栈找到最长的的X了
//现在放回去最长X,以后可能有|需要判断
for(int j=0;j<max_n;j){
stk[top]=’x’;
}
}
int main(){
cin>>str;
int l=str.size();
for(int i=0;i<l;i){
int ch=str[i];
if(ch!=’)’){
stk[top]=ch;
}
else count();
}
count();//理括号外的任何“x”字符,之前这里忘了可恶
cout<<top;
}// ((xx|xxx)x|(x|xx)) (xx)x|xx(xxx|xx)(x(xx|x)xx)xxx
// (xx)x|x
没注意“一个括号里可能有多个’|’,要选择合适的做法去得到当前括号最大长度”,,难受了
orz orz orz orz orz
这思路更加通俗易懂,up主tql
这思路太厉害了,佩服up主
不错的思路
可以