考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入
----
一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出
----
这个正则表达式能接受的最长字符串的长度。
例如,
输入:
((xx|xxx)x|(x|xx))xx
程序应该输出:
6
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
思路:
这道题使用深度搜索的方法,输入字符串,从前往后读读字符串的过程中,如果读到‘(’,则进入递归。递归是为了计算一个’()‘内的值。
读字符串的过程中,如果遇到‘x'就让temp++,位置++;如果遇到’|‘,则用ans保存temp的值,tenp=0,从而让temp保存’|‘之后的值,位置++;读到’)‘时,位置++,退出循环。最后进行一次比较,比较ans保存的|前面的值的大小和|后面temp的值,返回最大值。
递归回退,解决完小问题之后解决大问题,最终返回最大值。
代码:
1. s = input() 2. pos, length = 0, len(s) 3. def dfs(): 4. global pos, length 5. ans, temp = 0, 0 6. while pos<length: # length达不到 所以pos会遍历所有索引的位置 7. if s[pos] == '(': #遇到(,进入下一位置,进入递归,将大问题划分为小问题 8. pos += 1 9. temp += dfs() 10. elif s[pos] == 'x':#遇到x 11. pos += 1 12. temp += 1 13. elif s[pos] == '|': 14. pos += 1 15. ans = max(ans, temp) 16. temp = 0 17. elif s[pos] == ')': 18. pos += 1 19. break 20. # xx|xxxxx 21. ans = max(ans, temp) 22. return ans 23. ans = dfs() 24. print(ans)