282. Expression Add Operators
problem description
Given a string that contains only digits 0-9 and a target value, return all possibilities to add binary operators (not unary) +, -, or * between the digits so they evaluate to the target value.
Example 1:
Example 2:
Example 3:
Example 4:
Example 5:
algorithm thought
对于每个能放置操作符的地方,有4种情况。第一种是不放置,然后三种是放置3个不同的操作符。
将情况大概讲出来之后,就知道这里使用回溯法解决问题了。这里问题关键在于如果前面是一个加法,然后碰到一个乘法,如何解决。
这里在回溯的时候,保存前面一个操作的数字值。如果当前是乘法,就将当前值减去或者加上前面的值(相当于回溯到前面),然后将前面的值和当前数字相乘,再让前面值加上或者减去当前值。这是大概的思路。实际实现时候,可以优化。
需要注意的是,如果碰到开头为0的字符串需要处理。这里对要求对c++数字和字符串转化操作熟悉
code
algorithm analysis
回溯法时间复杂度分析比较困难,只需要知道这里是指数级时间复杂度。这里还有一个关键的优化在于对string的处理。我看别的答案直接使用operator +,并且没有使用左值引用减少析构和构造。时间复杂度400ms左右。在利用引用优化和+=优化之后,时间复杂度减低到了70ms左右。这么看来string的析构和构造还真挺耗时间的。
Last updated