思路:使用栈匹配的思想。
1)检查非首字符时,栈是否为空。
2)检查<![CDATA能否和]]>匹配
3)检查</能否和>匹配,若能匹配,则出栈比较
4)检查<能否和>匹配,若能匹配,则检查规则,符合规则方可进栈。
5)全部遍历完后,检查栈是否为空。
class Solution(object):
def isValid(self, code):
"""
:type code: str
:rtype: bool
"""
stack = []
i = 0
n = len(code)
while(i<n):
if stack == [] and i!=0:
print 'stack empty'
return False
if code[i:i+9] == "<![CDATA[":
i = code.find("]]>",i+9)
if i == -1:
print 'cdata'
return False
i+=2
i+=1
continue
if code[i:i+2] == "</":
j = code.find(">",i+2)
if j == -1:
print 'not find'
return False
if stack != [] and stack[-1] == code[i+2:j]:
stack.pop()
i = j
else:
print 'pop'
return False
#print i,n
i+=1
continue
if code[i] == "<":
j = code.find(">",i+1)
if j == -1 or j==i+1 or j-i>10:
print "length"
return False
for t in code[i+1:j]:
if ord(t) < ord('A') or ord(t) > ord('Z'):
print "upper"
return False
stack.append(code[i+1:j])
i = j
i += 1
#print stack
if stack != []:
print 'empty'
return False
return True