模拟147 糖葫芦 | 豆包Marscode AI 刷题

46 阅读3分钟

题目回顾

image.png

题目分析

这个问题是一个典型的搜索和比较问题,我们需要找到甜度最大的独一无二的糖葫芦串。这里的“独一无二”指的是糖葫芦串不仅本身不能与其他糖葫芦串相同,而且它的翻转(即字符串反转)也不能与其他糖葫芦串相同。

分析步骤:

  1. 甜度计算:首先,我们需要一个函数来计算每个糖葫芦串的甜度。甜度是糖葫芦串中每个字符与字符'a'的差值之和。例如,字符'a'的甜度为0,'b'的甜度为1,以此类推,'z'的甜度为25。

  2. 独一无二性检查:我们需要检查每个糖葫芦串是否独一无二。这包括两个条件:

    • 糖葫芦串本身不能与其他任何糖葫芦串相同。
    • 糖葫芦串的翻转也不能与其他任何糖葫芦串相同。
  3. 比较和选择:我们需要遍历所有糖葫芦串,使用上述两个条件进行筛选,然后从中选择甜度最大的糖葫芦串。

  4. 特殊情况处理:如果没有糖葫芦串满足独一无二条件,我们需要返回0。

代码实现

def solution(n: int, m: int, strings: list) -> int:
    # 用于存储所有糖葫芦的甜度
    sweetness = {}
    # 用于存储所有糖葫芦的出现次数
    string_count = {}

    for s in strings:
        # 计算糖葫芦的甜度
        sweet = sum((ord(char) - ord('a')) for char in s)
        # 更新甜度字典
        sweetness[s] = max(sweetness.get(s, 0), sweet)
        # 更新字符串出现次数
        string_count[s] = string_count.get(s, 0) + 1
        # 更新翻转字符串的出现次数
        reversed_s = s[::-1]
        if reversed_s != s:
            string_count[reversed_s] = string_count.get(reversed_s, 0) + 1

    # 找出最大的甜度
    max_sweetness = 0
    for s, sweet in sweetness.items():
        # 如果糖葫芦是独一无二的,并且它的翻转版本也没有出现过,则更新最大甜度
        if string_count[s] == 1 and string_count.get(s[::-1], 0) == 1:
            max_sweetness = max(max_sweetness, sweet)

    return max_sweetness

if __name__ == '__main__':
    print(solution(3, 3, ["ccz", "cba", "zcc"]) == 3)
    print(solution(2, 3, ["abc", "cba"]) == 0)
    print(solution(5, 2, ["aa", "bb", "ab", "ba", "cc"]) == 4)

代码分析

  1. 初始化:创建一个字典来存储每个糖葫芦串的甜度,以及一个集合来存储所有出现过的糖葫芦串和它们的翻转。

  2. 遍历糖葫芦串:对于每个糖葫芦串:

    • 计算甜度。
    • 检查糖葫芦串及其翻转是否已经存在于集合中。如果不存在,将它们添加到集合,并更新字典中的甜度。
  3. 筛选独一无二糖葫芦串:遍历字典,找到所有甜度最大的糖葫芦串,但只选择那些满足独一无二条件的。

  4. 返回结果:如果有满足条件的糖葫芦串,返回最大的甜度;如果没有,返回0。

复杂度分析:

  • 时间复杂度:O(n*m),其中n是糖葫芦串的数量,m是每个糖葫芦串的长度。这是因为我们需要遍历每个糖葫芦串,并计算其甜度。
  • 空间复杂度:O(n*m),最坏情况下,每个糖葫芦串都是独一无二的,我们需要存储所有糖葫芦串及其翻转。

这个问题的关键在于如何高效地检查一个字符串及其翻转是否独一无二,以及如何在找到所有可能的候选糖葫芦串后,快速确定哪个具有最大的甜度。使用字典和集合可以有效地帮助我们实现这些目标。