解析:
直接暴力求解,将两个cstring中的字符提取出来存在结构体中
结构体中保存当前位置的字符ch,接下来连续字符的个数num。
再把nstring压缩,存于结构题中,将nstring的结构体掐头去尾,头部和尾部的字符要相同,头部和尾部的要小于等于目标串的个数,中间的部分要相同,由于数据量比较小,中间部分直接用O(n^2)暴力比较。
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cctype>
using namespace std;
typedef long long ll;
const int N = 2e5;
struct Node {
char ch;
int num;
}tar[N], pat[N];
int tot, tot2;
bool equal(Node a, Node b) {
if(a.ch == b.ch && a.num == b.num) return true;
return false;
}
bool biger(Node a, Node b) {
if(a.ch == b.ch && a.num >= b.num) return true;
return false;
}
bool judge() {
if(tot2 == 1) {
for(int i = 0; i < tot; i++)
if(biger(tar[i], pat[0]))
return true;
}else if(tot2 == 2) {
for(int i = 0; i < tot-1; i++)
if(biger(tar[i], pat[0]) && biger(tar[i+1], pat[1]))
return true;
}else {
for(int i = 0; i < tot; i++) {
if(i + tot2 < tot && biger(tar[i], pat[0])
&& biger(tar[i+tot2-1], pat[tot2-1])
&& equal(tar[i+1], pat[1])) {
int k = i+2, j;
for(j = 2; j < tot2-1; j++, k++) {
if(equal(tar[k], pat[j]))
continue;
else
break;
}
if(j == tot2-1)
return true;
}
}
}
return false;
}
char cstr[N], nstr[N];
int main() {
while(scanf("%s", cstr) != EOF) {
scanf("%s", nstr);
tot = tot2 = 0;
int sum = 0;
for(int i = 0; cstr[i]; i++) {
if(cstr[i+1] == '[') {
int j = i+2;
sum = 0;
do {
sum += sum*10 + (cstr[j] - '0');
j++;
}while(isalnum(cstr[j]));
tar[tot].ch = cstr[i];
tar[tot++].num = sum;
i = j;
}else {
sum = 1;
for(int j = i+1; cstr[j] && cstr[i] == cstr[j]; j++) {
sum++;
i = j;
}
tar[tot].ch = cstr[i];
tar[tot++].num = sum;
}
}
for(int i = 0; nstr[i]; i++) {
sum = 1;
for(int j = i+1; nstr[j] && nstr[i] == nstr[j]; j++) {
sum++;
i = j;
}
pat[tot2].ch = nstr[i];
pat[tot2++].num = sum;
}
printf("%s\n", judge()? "True" : "False");
}
return 0;
}