一共写了3遍,2遍超时,第三遍看了别人的代码才写出来的。。。
第一遍,直接保存整颗子树,也就是整个子表达式。
为了得到子表达式的值,我频繁调用substr函数。
为了找到分隔左右子表达式的逗号,我直接遍历子表达式。
最后用map去映射。
结果超时。。
后来看了下紫书,说不能保存整颗子树。。
说比较两棵树的时间复杂度是O(n),循环枚举两颗子树,总时间复杂度高达O(n^3)。
我本以为map比较高效的,但后来我仔细算了下发现不会高效很多。
我们都知道map的时间复杂度是O(logn),但是那只是查询的复杂度。如果你查询的是字符串,那就多O(n),每个子树查询一遍,就又多O(n),总共O(n^2logn)。
伤不起。。。
第二遍,建树使扫描整个子表达式找到中间的那个逗号
按书上说的改了下子树的保存方式后,时间复杂度变为O(nlogn),依旧超时。
后来上网看别人的代码,才知道我建树的方法太粗暴了。频繁调运substr+遍历找逗号,都不知道循环多少遍了。
只有扫描一遍的才不会超时。
参考 http://www.bubuko.com/infodetail-646757.html
AC代码
#include
#include
#include
第一遍代码
#include
#include
#include
#include
第二遍代码
#include
#include
#include
#include
#include