ACM.ZJU 2800 判断给定输入是否是一个集合,该如何处理

ACM.ZJU 2800 判断给定输入是否是一个集合
形式语法
Set ::= "{" Elementlist "}"
Elementlist ::= <empty> | List
List ::= Element | Element "," List
Element ::= Atom | Set
Atom ::= "{" | "}" | ","

要求写一个程序,高效的判断给定输入是否是集合。每行最大长度为200个字符。

示例输入
3
{{{}}
{{},{,,{{}},{},{}}},{{,}},},}}
{{,},{},{,},}}

示例输出
Word #1: Set
Word #2: Set
Word #3: Set
Word #4: No Set

我试了回溯法等,超时,后来想到可以用动态规划法。程序好写,但是结果错误。想破脑袋不知道那里边界没有考虑到,
下面是我的程序,请师傅们帮忙找找漏洞。


------解决方案--------------------
脑袋想爆了也不知道哪里不对,lzAc掉的话一定把错误的原因贴出来呀,奋斗了1个多小时终于放弃了
------解决方案--------------------
我想,这个题目可以如下考虑
使用动态规划判断,记录[0,k)子串可以形成的状态,状态有下面俩成员:
i) 还有numberLeft个{多余,要求numberLeft>=1
ii) 当前集合的状态,有三个状态'{',',','E': 
1. '{': 也就是当前集合还只有{,里面没有任何元素和',',
所以后面如果遇上‘{’,可以numberLeft加1,保持状态'{';也可以numberLeft不变,变为状态'E'
如果后面遇上‘}’,可以numberLeft减1,变为状态'E'(当成});也可以numberLeft不变,变为状态'E'(当成元素)
如果后面遇上‘,’,将状态变成','
2. ',': 也就是当前集合里面最后遇到的是","
所以后面如果遇上‘{’,可以numberLeft加1,变成状态'{';也可以numberLeft不变,变为状态'E'
如果后面遇上‘}’,可以numberLeft减1,变为状态'E'(当成});也可以numberLeft不变,变为状态'E'(当成元素)
如果后面遇上‘,’,将状态保持','
3. 'E': 也就是当前集合最后是一个元素
所以后面如果遇上'{',淘汰这种可能性
如果后面遇上‘}’,将numberLeft减1,变为状态'E'(当成})
如果后面遇上‘,’,将状态变为','
在上面过程中,任何时候如果numberLeft减少到0,这种情况也要淘汰。
知道最后一步如果能够到达一个numberLeft正好是0的状态,那么结果就是集合。

------解决方案--------------------
2661690 2007-10-29 10:04:28 Accepted 2800 C++ 00:00.08 1016K tailzhou 

输出格式错误!

printf("Word# %d: %sSet\n",i,WhatIsThis(0,n-1)==1?"":"No ");
==>
printf("Word #%d: %sSet\n",i,WhatIsThis(0,n-1)==1?"":"No ");