小U的相似字符串

167 阅读2分钟

问题描述

小u认为两个字符串相似,当且仅当它们每个字母的个数都相等。 例如,"abcbd"和 "dbcba"是相似的,"abcd" 和 "abcd" 也是相似的;而"abb" 和"aab" 不相似,"ac" 和 "cca" 也不相似。 例如,“abcbd”和“dbcba”是相似的,“abcd”和“abcd”也是相似的;而“abb”和“艺术展”不相似,“交流”和“cca”也不相似。 现在小U手中有 n 个字符串,她想知道有多少对字符串是相似的。

问题理解

我们需要判断给定的 n 个字符串中有多少对是相似的。两个字符串相似的定义是它们包含的每个字母的个数都相等。例如,"abcbd" 和 "dbcba" 是相似的,因为它们都包含1个'a',1个'b',2个'c',1个'd'。

数据结构选择

  1. 字典(dict :用于存储每个字符串的字母统计结果。
  2. 列表(list :用于统计每个字符串中每个字母的个数。
  3. 元组(tuple :用于将字母统计结果转换为不可变对象,以便作为字典的键。

算法步骤

  1. 遍历每个字符串:对每个字符串进行字母统计。
  2. 统计字母个数:使用一个长度为26的列表来统计每个字母的个数。
  3. 转换为元组:将统计结果转换为元组,以便作为字典的键。
  4. 记录出现次数:使用defaultdict记录每个统计结果出现的次数。
  5. 计算组合数:对于每个统计结果,如果出现次数大于1,计算组合数(即count * (count - 1) // 2)。

代码实现

from collections import defaultdict

def solution(n: int, strings: list) -> int: # 用于存储每个字符串的字母统计结果 count_dict = defaultdict(int)

# 遍历每个字符串
for s in strings:
    # 统计当前字符串中每个字母的个数
    letter_count = [0] * 26  # 26个字母的计数器
    for char in s:
        letter_count[ord(char) - ord('a')] += 1
    
    # 将统计结果转换为元组,作为字典的键
    count_tuple = tuple(letter_count)
    
    # 记录当前统计结果出现的次数
    count_dict[count_tuple] += 1

# 计算相似字符串的对数
similar_pairs = 0
for count in count_dict.values():
    if count > 1:
        # 如果某个统计结果出现了多次,计算组合数
        similar_pairs += count * (count - 1) // 2

return similar_pairs

if name == 'main': print(solution(7, ["abcbd", "dbcba", "abcd", "abcd", "adbc", "aa", "aa"]) == 5) print(solution(3, ["aab", "bba", "baa"]) == 1) print(solution(5, ["abc", "def", "ghi", "jkl", "mno"]) == 0) 1. 使用collections.Counter简化字母统计
collections.Counter可以直接统计字符串中每个字符的个数,简化代码。

  1. 优化组合数的计算
    组合数的计算可以直接使用数学公式,避免不必要的循环。