返回
LeetCode——最长回文串(Set + 打牌思路)
前端
2023-10-03 16:56:00
最长回文串——巧用Set和打牌思路
众所周知,LeetCode是一个备受欢迎的编程题库,深受程序员青睐,每天吸引着无数程序员竞相解题。它包含大量精心设计的问题,涵盖各种编程语言和技术。最长回文串便是其中一道颇具挑战性的题目,现将其解法分享如下:
Set登场
我们首先需要创建一个Set,它将发挥重要作用。Set是一个集合,存储的元素互不重复,就像扑克牌中的每一张牌一样。
打牌思路
- 摸牌 :将字符串中的每个字符视为一张牌,依次从字符串中“摸出”这些“牌”,并将其加入到Set中。
- 配对 :在Set中,每当遇到一张已经存在的“牌”时,就意味着找到了它的“配对”,此时便可将其从Set中“打出”。与扑克牌中的配对类似,每打出一对“牌”,即可得到两分。
- 计分 :根据以上步骤,我们将“摸牌”和“配对”的过程不断进行,直至字符串中所有的“牌”都已被“摸出”。最后,将所有“配对”所获得的分数相加,即可得到最长的回文串长度。
示例:
对于字符串“abcabcbb”,我们可以按照以下步骤解决:
- 首先,“摸出”第一张牌“a”,将其加入Set。
- 接着,“摸出”第二张牌“b”,发现Set中不存在“b”,故将其加入Set。
- 再“摸出”第三张牌“c”,又发现Set中没有“c”,于是将其加入Set。
- 继续“摸出”第四张牌“a”,发现Set中已有“a”,于是将其“配对”并从Set中“打出”,得分+2。
- 按照上述步骤,“摸出”剩余的“牌”并进行“配对”,最终得出最长回文串长度为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最长回文串问题的方法,充分体现了编程的乐趣和挑战。希望对各位读者有所启发,也期待大家踊跃交流自己的解题思路。