递归判断,注意每个只有小写字母的正确句子只有一个字母(即 "p"为正确句子,"pq"为错误句子),详细见注释。
#include <iostream>
#include <string>
using namespace std;
string s;
//判断字符串s的第left个字符至第right个字符是否为一个正确的句子
bool isCorrect(int left, int right)
{
if (left == right) //只有一个字符
{
if (s[left] >= 'p' && s[left] <= 'z')
return true;
else
return false;
}
else
{
if (s[left] == 'N') //第一个字符为'N'
{
if (isCorrect(left + 1, right))
return true;
else
return false;
}
else if (s[left] == 'C' || s[left] == 'D' || s[left] == 'E' || s[left] == 'I')
{
bool flag = false; //第一个字符之后的字符串是否能分成两个正确的句子
for (int i = left + 1; i < right; i++)
{
if (isCorrect(left + 1, i) && isCorrect(i + 1, right))
{
flag = true;
break;
}
}
if (flag)
return true;
else
return false;
}
else //字符串长度不为1,且第一个字符不是规定的大写字母
return false;
}
}
int main()
{
while (cin >> s)
{
int len = s.size();
if (isCorrect(0, len - 1))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
继续加油。