返回

LeetCode——最长回文串(Set + 打牌思路)

前端

最长回文串——巧用Set和打牌思路

众所周知,LeetCode是一个备受欢迎的编程题库,深受程序员青睐,每天吸引着无数程序员竞相解题。它包含大量精心设计的问题,涵盖各种编程语言和技术。最长回文串便是其中一道颇具挑战性的题目,现将其解法分享如下:

Set登场

我们首先需要创建一个Set,它将发挥重要作用。Set是一个集合,存储的元素互不重复,就像扑克牌中的每一张牌一样。

打牌思路

  1. 摸牌 :将字符串中的每个字符视为一张牌,依次从字符串中“摸出”这些“牌”,并将其加入到Set中。
  2. 配对 :在Set中,每当遇到一张已经存在的“牌”时,就意味着找到了它的“配对”,此时便可将其从Set中“打出”。与扑克牌中的配对类似,每打出一对“牌”,即可得到两分。
  3. 计分 :根据以上步骤,我们将“摸牌”和“配对”的过程不断进行,直至字符串中所有的“牌”都已被“摸出”。最后,将所有“配对”所获得的分数相加,即可得到最长的回文串长度。

示例:

对于字符串“abcabcbb”,我们可以按照以下步骤解决:

  1. 首先,“摸出”第一张牌“a”,将其加入Set。
  2. 接着,“摸出”第二张牌“b”,发现Set中不存在“b”,故将其加入Set。
  3. 再“摸出”第三张牌“c”,又发现Set中没有“c”,于是将其加入Set。
  4. 继续“摸出”第四张牌“a”,发现Set中已有“a”,于是将其“配对”并从Set中“打出”,得分+2。
  5. 按照上述步骤,“摸出”剩余的“牌”并进行“配对”,最终得出最长回文串长度为4。

算法分析

该算法的时间复杂度为O(n),其中n为字符串的长度。在最坏情况下,所有字符都互不相同,导致Set始终为空,算法退化为暴力枚举,即需要遍历字符串中的每个字符,与其他所有字符进行比较,时间复杂度为O(n^2)。但在实际应用中,这种情况很少见,因此算法的平均时间复杂度为O(n)。

代码实现

def longestPalindrome(s):
  # 创建一个Set
  char_set = set()

  # 遍历字符串中的每个字符
  for char in s:
    # 如果字符在Set中,将其从Set中删去,并且给sum+2
    if char in char_set:
      char_set.remove(char)
      sum += 2
    # 否则,将字符加入到Set中
    else:
      char_set.add(char)

  # 如果Set中还有字符,则说明存在一个字符没有配对,将sum+1
  if char_set:
    sum += 1

  # 返回最长回文串的长度
  return sum

# 测试用例
s = "abcabcbb"
print(longestPalindrome(s))  # 输出:5

结语

这种利用Set和打牌思路解决LeetCode最长回文串问题的方法,充分体现了编程的乐趣和挑战。希望对各位读者有所启发,也期待大家踊跃交流自己的解题思路。