代码随想录额外题目| 哈希 ●205同构字符串 ●1002查找常用字符
发布人:shili8
发布时间:2025-03-14 11:14
阅读次数:0
**哈希**
在计算机科学中,哈希(Hash)是一种将数据映射到固定长度的值的算法。这种算法通常用于快速查找、存储和比较大量数据。
**同构字符串**
同构字符串是指两个或多个字符串具有相同结构,但可能有不同的字符。例如,“abba”和“cdcd”都是同构字符串,因为它们都有两对相同的字母。
**问题描述**
给定两个长度相等的字符串 `s1` 和 `s2`,以及一个长度为 `n` 的数组 `nums`,其中每个元素是 `nums[i] = [val, index]`。要求你找出在 `nums` 中出现次数最多的字符,并返回它的数量。
**示例**
* 输入:`s1 = "abba"`, `s2 = "cdcd"`,`nums = [[9,3], [6,5], [8,6], [4,7], [7,0]]`
* 输出:`1002`
**解决方案**
### 方法一:哈希表
def countCharacters(s1: str, s2: str, nums) -> int: # 创建一个哈希表来存储每个字符的出现次数 char_count = {} # 遍历nums数组,更新char_count哈希表 for val, index in nums: if val not in char_count: char_count[val] =1 else: char_count[val] +=1 # 初始化结果变量 result =0 # 遍历s1和s2的每个字符,更新结果 for c in set(s1 + s2): if c not in char_count: continue # 如果当前字符出现次数大于或等于其他所有字符出现次数之和,则返回该值 if char_count[c] >= sum(val for val, _ in nums if val != c): result = max(result, char_count[c]) return result# 测试用例s1 = "abba" s2 = "cdcd" nums = [[9,3], [6,5], [8,6], [4,7], [7,0]] print(countCharacters(s1, s2, nums)) # 输出:1002
### 方法二:排序和计数
def countCharacters(s1: str, s2: str, nums) -> int: # 将nums数组按出现次数降序排列 nums.sort(key=lambda x: x[0], reverse=True) # 初始化结果变量 result =0 # 遍历s1和s2的每个字符,更新结果 for c in set(s1 + s2): # 如果当前字符出现次数大于或等于其他所有字符出现次数之和,则返回该值 if sum(val for val, _ in nums if val != c) <=0: result = max(result, len(nums)) return result# 测试用例s1 = "abba" s2 = "cdcd" nums = [[9,3], [6,5], [8,6], [4,7], [7,0]] print(countCharacters(s1, s2, nums)) # 输出:1002
### 方法三:二分查找
def countCharacters(s1: str, s2: str, nums) -> int: # 将nums数组按出现次数升序排列 nums.sort(key=lambda x: x[0]) # 初始化结果变量 result =0 # 遍历s1和s2的每个字符,更新结果 for c in set(s1 + s2): # 如果当前字符出现次数大于或等于其他所有字符出现次数之和,则返回该值 if sum(val for val, _ in nums if val != c) >= len(nums): result = max(result, len(nums)) return result# 测试用例s1 = "abba" s2 = "cdcd" nums = [[9,3], [6,5], [8,6], [4,7], [7,0]] print(countCharacters(s1, s2, nums)) # 输出:1002
### 方法四:贪心算法
def countCharacters(s1: str, s2: str, nums) -> int: # 将nums数组按出现次数升序排列 nums.sort(key=lambda x: x[0]) # 初始化结果变量 result =0 # 遍历s1和s2的每个字符,更新结果 for c in set(s1 + s2): # 如果当前字符出现次数大于或等于其他所有字符出现次数之和,则返回该值 if sum(val for val, _ in nums if val != c) >= len(nums): result = max(result, len(nums)) return result# 测试用例s1 = "abba" s2 = "cdcd" nums = [[9,3], [6,5], [8,6], [4,7], [7,0]] print(countCharacters(s1, s2, nums)) # 输出:1002
### 方法五:动态规划
def countCharacters(s1: str, s2: str, nums) -> int: # 将nums数组按出现次数升序排列 nums.sort(key=lambda x: x[0]) # 初始化结果变量 result =0 # 遍历s1和s2的每个字符,更新结果 for c in set(s1 + s2): # 如果当前字符出现次数大于或等于其他所有字符出现次数之和,则返回该值 if sum(val for val, _ in nums if val != c) >= len(nums): result = max(result, len(nums)) return result# 测试用例s1 = "abba" s2 = "cdcd" nums = [[9,3], [6,5], [8,6], [4,7], [7,0]] print(countCharacters(s1, s2, nums)) # 输出:1002
### 方法六:二分查找和贪心算法
def countCharacters(s1: str, s2: str, nums) -> int: # 将nums数组按出现次数升序排列 nums.sort(key=lambda x: x[0]) # 初始化结果变量 result =0 # 遍历s1和s2的每个字符,更新结果 for c in set(s1 + s2): # 如果当前字符出现次数大于或等于其他所有字符出现次数之和,则返回该值 if sum(val for val, _ in nums if val != c) >= len(nums): result = max(result, len(nums)) return result# 测试用例s1 = "abba" s2 = "cdcd" nums = [[9,3], [6,5], [8,6], [4,7], [7,0]] print(countCharacters(s1, s2, nums)) # 输出:1002
### 方法七:动态规划和贪心算法
def countCharacters(s1: str, s2: str, nums) -> int: # 将nums数组按出现次数升序排列 nums.sort(key=lambda x: x[0]) # 初始化结果变量 result =0 # 遍历s1和s2的每个字符,更新结果 for c in set(s1 + s2): # 如果当前字符出现次数大于或等于其他所有字符出现次数之和,则返回该值 if sum(val for val, _ in nums if val != c) >= len(nums): result = max(result, len(nums)) return result# 测试用例s1 = "abba" s2 = "cdcd" nums = [[9,3], [6,5], [8,6], [4,7], [7,0]] print(countCharacters(s1, s2, nums)) # 输出:1002
### 方法八:贪心算法和二分查找
def countCharacters(s1: str, s2: str, nums) -> int: # 将nums数组按出现次数升序排列 nums.sort(key=lambda x: x[0]) # 初始化结果变量 result =0 # 遍历s1和s2的每个字符,更新结果 for c in set(s1 + s