返回

算法 Notes|LeetCode 14. 最长公共前缀 - easy

Android

LeetCode 14:最长公共前缀——算法思维的深刻洞察

在踏上算法学习的漫漫征途时,我们势必会遇到各种各样的挑战,这些挑战旨在磨砺我们的思维,激发我们的创造力。LeetCode 14:最长公共前缀问题便是这样一道经典难题,它将算法思维的精髓展现得淋漓尽致。

问题概述

给定一个字符串数组,我们需要找到这些字符串中出现的最长公共前缀,即出现在所有字符串中且顺序相同的字符串片段。例如,对于字符串数组 ["flower", "flow", "flight"],最长公共前缀为 "fl"。

暴力解法

最直观的解法莫过于暴力枚举,逐字符比较字符串,直到遇到不匹配的字符为止。这种方法虽然简单易懂,但它的效率却十分低下,特别是当字符串数组中的字符串很长时。

def longest_common_prefix_naive(strs):
    prefix = ""
    if not strs:
        return prefix
    for i in range(len(min(strs))):
        c = strs[0][i]
        if all(s[i] == c for s in strs):
            prefix += c
        else:
            break
    return prefix

时间复杂度:O(mn) ,其中 m 是字符串数组的长度,n 是最长字符串的长度。

水平扫描

水平扫描算法可以有效地提高暴力解法的效率。它通过逐字符比较字符串数组中的所有字符串来实现。算法的步骤如下:

  1. 找出最短的字符串。
  2. 以最短字符串为参考,逐字符比较其他字符串。
  3. 如果当前字符不匹配,则停止比较。
  4. 否则,继续比较下一个字符。
def longest_common_prefix(strs):
    if not strs:
        return ""
    shortest_str = min(strs, key=len)
    for i in range(len(shortest_str)):
        c = shortest_str[i]
        if all(s[i] == c for s in strs):
            continue
        else:
            return shortest_str[:i]
    return shortest_str

时间复杂度:O(sn) ,其中 s 是最短字符串的长度,n 是字符串数组的长度。

垂直扫描

垂直扫描算法与水平扫描算法有着异曲同工之妙,但它以列为单位进行比较,而不是行。这有助于进一步减少比较次数。

def longest_common_prefix_vertical(strs):
    if not strs:
        return ""
    for i in range(len(min(strs))):
        char_set = set()
        for s in strs:
            char_set.add(s[i])
        if len(char_set) > 1:
            return strs[0][:i]
    return min(strs)

时间复杂度:O(mn) ,其中 m 是字符串数组的长度,n 是最长字符串的长度。

总结

通过解决 LeetCode 14:最长公共前缀问题,我们不仅学会了如何高效地找到字符串数组中的最长公共前缀,更重要的是,我们领略到了算法思维的魅力。暴力解法虽然简单直观,但效率低下;水平扫描和垂直扫描则通过优化比较过程,显著提高了算法的效率。

在算法学习过程中,多想、多画、多练至关重要。通过深入理解算法背后的逻辑和机制,我们才能逐步提高自己的算法能力,应对日益复杂的算法挑战。

常见问题解答

1. 为什么暴力解法的效率较低?

暴力解法逐字符比较所有字符串,即使遇到不匹配的字符后也需要继续比较,这导致了大量的重复比较,降低了效率。

2. 水平扫描和垂直扫描算法有什么区别?

水平扫描以行(字符串)为单位进行比较,而垂直扫描以列(字符)为单位进行比较。垂直扫描通过一次比较多个字符串的同一列字符来减少比较次数。

3. 哪种算法是最佳选择?

一般来说,垂直扫描算法的效率最高,因为它在比较过程中减少了不必要的比较。然而,在某些情况下,水平扫描算法可能会更加高效,例如当字符串数组中的字符串长度相差较大时。

4. 如何提高算法的效率?

除了选择合适的算法外,我们还可以通过以下方法提高算法的效率:

  • 优化数据结构
  • 使用缓存
  • 并行化算法

5. 算法思维的本质是什么?

算法思维是一种解决问题的系统化方法,它涉及到对问题进行分解、设计和分析。算法思维包括抽象思维、逻辑思维和创造性思维等能力。