历届试题 正则问题
时间限制:1.0s 内存限制:256.0MB
问题描述
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出格式
这个正则表达式能接受的最长字符串的长度。
样例输入
((xx|xxx)x|(x|xx))xx
样例输出
6
数据规模和约定
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
解题思路: 本题栈的基础应用 思路很简单 ‘(’ ‘x’ ‘|’ 入栈 碰见‘)’然后出栈
出栈的时候 把他们连一起 然后用‘|’进行切割 模拟或运算
留下最长的那个字符串 入栈 最后所有的东西都出栈
在进行上面的操作 不过本题比较坑 括号有不是成对的 吐槽一下 什么破语法
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class 正则问题 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
char [] arr = scanner.next().toCharArray();
Stack<String> stack = new Stack<>();
for (int i = 0; i < arr.length; i++) {
switch (arr[i]) {
case '(':
stack.push("(");
break;
case 'x':
stack.push("x");
break;
case '|':
stack.push("|");
break;
default:
String v = "";
while (true) {
String k = stack.pop();
if (k.equals("(")) {
break;
}
v += k;
}
String[] str = v.split("\\|");
stack.push(test(str));
break;
}
}
String sum = "";
while (!stack.isEmpty()) {
String v = stack.pop();
if (v.equals("(") || v.equals(")")) {
continue;
}
sum += v;
}
String[] split = sum.split("\\|");
System.out.println(test(split).length());
}
}
private static String test(String[] split) {
// TODO Auto-generated method stub
Arrays.sort(split);
return split[split.length-1];
}
}
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
解题思路: 本题栈的基础应用 思路很简单 ‘(’ ‘x’ ‘|’ 入栈 碰见‘)’然后出栈
出栈的时候 把他们连一起 然后用‘|’进行切割 模拟或运算
留下最长的那个字符串 入栈 最后所有的东西都出栈
在进行上面的操作 不过本题比较坑 括号有不是成对的 吐槽一下 什么破语法
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class 正则问题 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
char [] arr = scanner.next().toCharArray();
Stack<String> stack = new Stack<>();
for (int i = 0; i < arr.length; i++) {
switch (arr[i]) {
case '(':
stack.push("(");
break;
case 'x':
stack.push("x");
break;
case '|':
stack.push("|");
break;
default:
String v = "";
while (true) {
String k = stack.pop();
if (k.equals("(")) {
break;
}
v += k;
}
String[] str = v.split("\\|");
stack.push(test(str));
break;
}
}
String sum = "";
while (!stack.isEmpty()) {
String v = stack.pop();
if (v.equals("(") || v.equals(")")) {
continue;
}
sum += v;
}
String[] split = sum.split("\\|");
System.out.println(test(split).length());
}
}
private static String test(String[] split) {
// TODO Auto-generated method stub
Arrays.sort(split);
return split[split.length-1];
}
}