微软编辑器的代码高亮 (恶心模拟)

来源:互联网 发布:c4世嘉轮毂数据 编辑:程序博客网 时间:2024/05/17 08:37

微软的一款代码编辑器 VS Code 需要在编辑代码时将代码高亮。其中,有一个子问题是判断一串文本是否是 一个合法字符串。一个合法字符串是指由一对单引号或一对双引号包裹的文本字符集,字符集包括所有英文小写字母、单引号、双引号和斜杠(\)。

比如”abc”、’ab”c’都是一个合法的字符串,而”abc”de”、’ab”c’和abc都不是一个合法的字符串。

字符串中可能有转义字符,转义字符只有 333 种:\”、\’ 和 \,分别表示:字符串中的双引号、单引号和斜杠

当字符串由 双引号 包裹时,字符串中的 双引号 必须以转义字符出现,否则会被认为是不合法字符串;

当字符串由 单引号 包裹时,字符串的 单引号 必须以转义字符出现,否则会被认为是不合法字符串;

字符串中的斜杠(\)必须以转义字符出现,否则会被认为是不合法字符串。

输入格式

只有一行,表示输入的文本,文本的长度 lenlenlen 满足 1≤len≤100001 \leq len \leq 100001≤len≤10000。保证输入只包含英文小写字母、单引号、双引号和斜杠(\)。

输出格式

如果输入的一串文本是一个合法的字符串,则输出Yes,否则输出No。
样例输入1

“abc”

样例输出1

Yes

样例输入2

“abc”“def”

样例输出2

No

样例输入3

“ab\c”

样例输出3

No

好恶心的模拟,WA了一发,因为这让两句话
当字符串由 双引号 包裹时,字符串中的 双引号 必须以转义字符出现,否则会被认为是不合法字符串当字符串由 单引号 包裹时,字符串的 单引号 必须以转义字符出现,否则会被认为是不合法字符串
太恶心了!!!!!

#include<bits/stdc++.h>using namespace std;const int maxn=10005;char a[maxn];char s[maxn];int main() {    while(~scanf("%s",a)) {        int len=strlen(a);        bool ans=true;        if(len<2) {            ans=false;        }        int f=-1;        if(ans&&a[0]=='\''&&a[len-1]=='\'')f=0;        if(ans&&a[0]=='"'&&a[len-1]=='"')f=1;        if(f==-1)ans=false;        if(len<=2){            puts(ans?"Yes":"No");continue;        }        a[0]=a[len-1]='*';        for(int i=0;i<len;++i){            if(a[i]=='*')continue;            if(a[i]=='\\'){                a[i]='*';                if(i+1<len&&(a[i+1]=='\''||a[i+1]=='"'||a[i+1]=='\\'))a[i+1]='*';                else ans=false;            }            if(a[i]=='\''){                if(i-1>=0&&a[i-1]=='\\')a[i]=a[i-1]='*';                else if(f==1);                else ans=false;            }            if(a[i]=='\"'){                if((i-1>=0&&a[i-1]=='\\'))a[i]=a[i-1]='*';                else if(f==0);                else ans=false;            }        }        int top=0;        for(int i=0;(i<len)&&ans;++i){            if(a[i]!='*')a[top++]=a[i];        }        len=top;        for(int i=0;ans&&(i<len);++i){            if(a[i]=='\''&&f==0)ans=false;            if(a[i]=='"'&&f==1)ans=false;            if(a[i]=='\\')ans=false;        }        puts(ans?"Yes":"No");    }    return 0;}
0 0
原创粉丝点击