寻找独一无二的糖葫芦串 | 豆包MarsCode AI刷题

127 阅读3分钟

问题描述

小C有n串长度为m的糖葫芦,每串糖葫芦可以用一个字符串表示。每个糖葫芦的甜度是所有字符甜度的总和,其中每个字符的甜度为该字符与 'a' 的差值。例如,字符 'a' 的甜度为 0,字符 'b' 的甜度为 1,依次类推,字符 'z' 的甜度为 25。

你需要帮助小C找到甜度最大的独一无二的糖葫芦。糖葫芦独一无二当且仅当它与其他n−1根糖葫芦都不同,且翻转后的字符串也不能与其他糖葫芦相同。例如,糖葫芦 "abc" 与 "cba" 视为相同的糖葫芦。

如果没有独一无二的糖葫芦,则返回0。


测试样例

样例1:

输入:n = 3, m = 3, strings = ["ccz", "cba", "zcc"]
输出:3

样例2:

输入:n = 2, m = 3, strings = ["abc", "cba"]
输出:0

样例3:

输入:n = 5, m = 2, strings = ["aa", "bb", "ab", "ba", "cc"]
输出:4


题意解析

关键点解析

  1. 甜度计算

    • 每个字符的甜度是该字符与 'a' 的差值。例如,'a' 的甜度为 0,'b' 的甜度为 1,'c' 的甜度为 2,依此类推。
    • 一个字符串的甜度是所有字符甜度的总和。
  2. 独一无二的糖葫芦

    • 一个糖葫芦是独一无二的,当且仅当它与其他n−1根糖葫芦都不同,且翻转后的字符串也不能与其他糖葫芦相同。
    • 例如,"abc" 和 "cba" 视为相同的糖葫芦。
  3. 目标

    • 找到甜度最大的独一无二的糖葫芦。
    • 如果没有独一无二的糖葫芦,则返回0。

数据结构选择

  1. 字符串处理

    • 我们需要处理字符串及其翻转后的字符串,因此可以使用字典来记录每个字符串及其翻转后的字符串的出现次数。
  2. 甜度计算

    • 甜度可以通过计算每个字符与 'a' 的差值来得到。

算法步骤

  1. 遍历所有字符串

    • 对于每个字符串,计算其甜度。
    • 同时,将字符串及其翻转后的字符串加入到一个字典中,记录它们的出现次数。
  2. 判断唯一性

    • 遍历字典中的每个字符串,如果某个字符串的出现次数为1,则说明它是独一无二的。
    • 计算该字符串的甜度,并与当前最大甜度进行比较。
  3. 返回结果

    • 如果没有独一无二的糖葫芦,则返回0。
    • 否则,返回甜度最大的独一无二的糖葫芦的甜度。

代码示例

from collections import defaultdict

def solution(n: int, m: int, strings: list) -> int:
    cnt, ret = defaultdict(int), 0
    for string in strings:
        if string[0] > string[-1]:
            string = string[::-1]
        cnt[string] += 1
    ret = 0
    for key, val in cnt.items():
        if val > 1: continue
        score = sum(ord(ch) - ord('a') for ch in key)
        ret = max(ret, score)
    return ret

知识点总结

  1. 字符串处理

    • 字符串翻转:使用 string[::-1] 来翻转字符串。
    • 字符串比较:比较字符串是否相同,可以使用 == 运算符。
  2. 字典(哈希表)

    • 记录出现次数:使用 defaultdict 来记录每个字符串及其翻转后的字符串的出现次数。
    • 唯一性判断:通过检查字典中的值来判断字符串是否唯一。
  3. ASCII码

    • 字符转换:使用 ord(ch) 获取字符的ASCII码值,通过 ord(ch) - ord('a') 计算字符的甜度。
  4. 遍历与迭代

    • 遍历字符串:使用 for 循环遍历字符串中的每个字符。
    • 遍历字典:使用 for item in dict.items() 遍历字典中的键值对。
  5. 最大值查找

    • 比较与更新:使用 max(a, b) 函数来比较两个值,并更新最大值。