微软的一款代码编辑器 VS Code 需要在编辑代码时将代码高亮。其中,有一个子问题是判断一串文本是否是 一个合法字符串。一个合法字符串是指由一对单引号或一对双引号包裹的文本字符集,字符集包括所有英文小写字母、单引号、双引号和斜杠(\)。
比如”abc”、’ab”c’(单引号,双引号,单引号)都是一个合法的字符串,而”abc”de”、’ab’'c’(四个单引号)和abc都不是一个合法的字符串。
字符串中可能有转义字符,转义字符只有 3 种:\”、\’ 和 \,分别表示:字符串中的双引号、单引号和斜杠
当字符串由 双引号 包裹时,字符串中的 双引号 必须以转义字符出现,否则会被认为是不合法字符串;
当字符串由 单引号 包裹时,字符串的 单引号 必须以转义字符出现,否则会被认为是不合法字符串;
字符串中的斜杠(\)必须以转义字符出现,否则会被认为是不合法字符串。
测试数据有多组,每组只有一行,表示输入的文本,文本的长度 len 满足 len ≤ 10000。保证输入只包含英文小写字母、单引号、双引号和斜杠(\)。
对于每组输入,如果输入的一串文本是一个合法的字符串,则输出Yes,否则输出No。
“abc”
“abc”“def”
“ab\c”
Yes
No
No
#include
using namespace std;
int main()
{
int i,k,flag;
char s[10010];
while(cin>>s)
{
flag=0;
k=strlen(s);
if(s[0]==39&&s[k-1]==39&&k>=2)
{
for(i=1;i<k-1;i++)
{
if(s[i]==92)
{
if(i==k-2)
{
flag=1;
cout<<"No\n";
break;
}
else
{
if(s[i+1]==39||s[i+1]==92||s[i+1]==34)
i++;
else
{
flag=1;
cout<<"No\n";
break;
}
}
}
else if(s[i]==39)
{
flag=1;
cout<<"No\n";
break;
}
}
if(flag==0)
cout<<"Yes\n";
}
else if(s[0]==34&&s[k-1]==34&&k>=2)
{
for(i=1;i<strlen(s)-1;i++)
{
if(s[i]==92)
{
if(i==k-2)
{
flag=1;
cout<<"No\n";
break;
}
else
{
if(s[i+1]==39||s[i+1]==92||s[i+1]==34)
i++;
else
{
flag=1;
cout<<"No\n";
break;
}
}
}
else if(s[i]==34)
{
flag=1;
cout<<"No\n";
break;
}
}
if(flag==0)
cout<<"Yes\n";
}
else
cout<<"No\n";
}
}
错误点,合法字符串最少是两个,不是三个!!!!
另外,代码可以简化一些
while(cin>>s)
{
flag=0;
k=strlen(s);
if((s[0]==34||s[k-1]==39)&&(s[0]==s[k-1])&&k>=2)
{
for(i=1;i<strlen(s)-1;i++)
{
if(s[i]==92)
{
if(i==k-2)
{
flag=1;
cout<<"No\n";
break;
}
else
{
if(s[i+1]==39||s[i+1]==92||s[i+1]==34)
i++;
else
{
flag=1;
cout<<"No\n";
break;
}
}
}
else if(s[i]==34||s[i]==39)
{
if(s[0]==s[i])
{
flag=1;
cout<<"No\n";
break;
}
}
}
if(flag==0)
cout<<"Yes\n";
}
else
cout<<"No\n";
}