考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入
一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出
这个正则表达式能接受的最长字符串的长度。
例如,
输入:
((xx|xxx)x|(x|xx))xx
程序应该输出:
6
**感受:**对于这题我感觉可懵,主要是上来的一个题目,当时想到了正则表达式,但是看见题干还是觉得没看懂,最后在网站上了别人的代码,然后还看了视频才有点明白
((xx|xxx)x|(x|xx))xx :“|”这个符号是找两边的最大数量,优先计算最内部括号的东西。
思路:深搜,对该字符串进行深搜,遇见“(”时调动函数本身计算括号里面的的数据,遇见“|”时进行计算,遇见“x”时进行自加,计算连续的“x”的数量,遇见“)”时对于括号内的数据进行计算,求出最大的数量
代码:
static String s;
static int len;
static int pos;
static int f() {
int m=0;
int tep=0;
while (pos<len) {
if(s.charAt(pos)=='(') {
pos++;
tep += f();
}else if(s.charAt(pos)=='x') {
pos++;
tep++;
}else if(s.charAt(pos)=='|') {
pos++;
m=Math.max(m,tep);
tep=0;
}else if(s.charAt(pos)==')') {
pos++;
m=Math.max(m,tep);
return m;
}
}
m=Math.max(m,tep);
return m;
}
public static void main(String[] args) {
Scanner sc=new Scanner (System.in);
s=sc.next();
len=s.length();
int ans=f();
System.out.println(ans);
}