"蔚来杯"2022牛客暑期多校训练营7-G-Regular Expression
题目大意
链接:https://ac.nowcoder.com/acm/contest/33192/G
来源:牛客网
给定一个字符串
A
A
A,求匹配
A
A
A的最短正则表达式的长度及数量。
解析
这题乍一看很长,看起来很难,但只要了解正则表达式并加以分析,其实也很简单。
对于长度为
1
1
1的字符串,其对应的最短正则表达式为其本身或".“。因此答案为
1
2
1~2
1 2。
当长度为
2
2
2时,最短长度为若两个字符相同,以字符串“aa”为例,对应的最短表达式为1"aa”, 2"a." , 3"a+" , 4"a
∗
*
∗" , 5"…" , 6".
∗
*
∗“,7“.a” 8”.+“,共8种;
若不同,以字符串"ab"为例,则有
1"ab”,2"a.“,3"a
∗
*
∗”,4".b",5".*“,6”…"
当长度大于
2
2
2时,最短正则表达式长度任为
2
2
2,对于任意情况".
∗
*
∗“和”.+"(a表示字符串首字母)必定成立,若字符串所有字母相同,则还有"a
∗
*
∗“和"a+”。
参考代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll;
int main(){
int t;
scanf("%d",&t);
while(t--){
string s;
cin>>s;
if(s.length() == 1){
printf("1 2\n");
}
else if(s.length() == 2){
if(s[0] == s[1]) printf("2 8\n");
else printf("2 6\n");
}
else{
int flag = 1;
for(int i=1;i<s.length();i++){
flag &= (s[i] == s[i - 1]);
}
printf("2 %d\n",2 + flag * 2);
}
}
}