逆向思维 LeetCode 14. 最长公共前缀,开拓一道思想新路
2023-11-24 06:51:09
逆向思维是一种思考方式,它要求我们从问题的终点开始思考,而不是从起点。这种思考方式可以帮助我们跳出思维定势,找到解决问题的新方法。
正向思维:从头开始,挨个比较
LeetCode 14. 最长公共前缀 题目要求我们求出一个字符串数组中所有字符串的最长公共前缀。比如给定字符串数组 ["flower", "flow", "flight"],最长公共前缀就是 "fl"。
正向思维的解法是,从头开始比较每个字符串的前缀,直到遇到不相同的前缀为止。这个解法的时间复杂度是 O(n*m),其中 n 是字符串数组的长度,m 是字符串的最大长度。
def longest_common_prefix(strs):
"""
:type strs: List[str]
:rtype: str
"""
if not strs:
return ""
shortest_str = min(strs, key=len)
for i, char in enumerate(shortest_str):
for other_str in strs:
if other_str[i] != char:
return shortest_str[:i]
return shortest_str
逆向思维:从尾开始,逐个追加
逆向思维的解法是,从尾开始比较每个字符串的后缀,直到遇到相同的后缀为止。这个解法的时间复杂度是 O(n*m),与正向思维的解法相同。
def longest_common_prefix(strs):
"""
:type strs: List[str]
:rtype: str
"""
if not strs:
return ""
common_prefix = ""
for i in range(len(min(strs, key=len)) - 1, -1, -1):
char = strs[0][i]
if all(s[i] == char for s in strs):
common_prefix = char + common_prefix
return common_prefix
逆向思维的优势:减少比较次数
逆向思维的解法之所以比正向思维的解法快,是因为它减少了比较次数。在正向思维的解法中,我们需要比较每个字符串的前缀,直到遇到不相同的前缀为止。而在逆向思维的解法中,我们只需要比较每个字符串的后缀,直到遇到相同的后缀为止。
逆向思维的启示:跳出思维定势,找到新解法
逆向思维的解法给我们一个启示:在解决问题时,不要局限于常规的思维方式,要勇于跳出思维定势,寻找新的解法。逆向思维可以帮助我们从不同的角度看待问题,找到新的突破口。
除了 LeetCode 14. 最长公共前缀之外,还有很多其他问题都可以用逆向思维来解决。比如,LeetCode 5. 最长回文子串、LeetCode 53. 最大子序和、LeetCode 72. 编辑距离等等。
逆向思维是一种非常重要的思维方式,它可以帮助我们解决很多复杂的问题。在学习算法和编程时,我们应该学会使用逆向思维,以帮助我们找到更好的解法。