微软的一款代码编辑器 VS Code 需要在编辑代码时将代码高亮。其中,有一个子问题是判断一串文本是否是 一个合法字符串。一个合法字符串是指由一对单引号或一对双引号包裹的文本字符集,字符集包括所有英文小写字母、单引号、双引号和斜杠(\
)。
比如"abc"
、'ab"c'
都是一个合法的字符串,而"abc"de"
、'ab''c'
和abc
都不是一个合法的字符串。
字符串中可能有转义字符,转义字符只有 3 种:\"
、\'
和 \\
,分别表示:字符串中的双引号、单引号和斜杠。
-
当字符串由 双引号 包裹时,字符串中的 双引号 必须以转义字符出现,否则会被认为是不合法字符串;
-
当字符串由 单引号 包裹时,字符串的 单引号 必须以转义字符出现,否则会被认为是不合法字符串;
-
字符串中的斜杠(
\
)必须以转义字符出现,否则会被认为是不合法字符串。
输入格式
只有一行,表示输入的文本,文本的长度 len 满足 1≤len≤10000。保证输入只包含英文小写字母、单引号、双引号和斜杠(\
)。
输出格式
如果输入的一串文本是一个合法的字符串,则输出Yes
,否则输出No
。
样例输入1
"abc"
样例输出1
Yes
样例输入2
"abc""def"
样例输出2
No
样例输入3
"ab\c"
样例输出3
NO
题意:如题。
题目链接:微软编辑器的代码高亮
解题思路:
考虑几种情况即可,考察细心。
1.\\',避免’\‘和其它字符冲突使用了。
2.注意首,尾的引号不能参与'\'的讨论。
代码:
#include
#include
using namespace std;
char a[10005];
int main()
{
int len,flag,i;
while(~scanf("%s",a)){
len=strlen(a);
if(len >= 2) flag=1; //合法字符串至少也得有两个
else flag=0;
for(i = 0;i < len && flag;i++ ){
if(!i){ //考虑开头必须为引号,而且首位引号要相同
if(a[i] != a[len-1]) flag=0;
if(a[0] != '\'' && a[0] != '\"') flag=0;
i++;
}
if(i >= len-1) break; //看i++后是否指向最后一个字符,最后一个字符不用判断(前面已经判断好了)
if(a[i] == '\\') { //斜杠后面只能有三种情况
i++;
if(i >= len-1) flag=0; //如果斜杠后面是最后一个字符就不行了
if(a[i] != '\\' && a[i] != '\'' && a[i] != '\"'){
flag=0;
}
}
else if(a[i] == '\'' || a[i] == '\"'){ //单独出现引号的情况,则不能和开头引号相同才行
if(a[0] == a[i]) flag=0;
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}