给你一个下标从 0 开始的字符串 s ,该字符串仅由小写英文字母组成,s 中的每个字母都 恰好 出现 两次 。另给你一个下标从 0 开始、长度为 26 的的整数数组 distance 。
字母表中的每个字母按从 0 到 25 依次编号(即,‘a’ -> 0, ‘b’ -> 1, ‘c’ -> 2, … , ‘z’ -> 25)。
在一个 匀整 字符串中,第 i 个字母的两次出现之间的字母数量是 distance[i] 。如果第 i 个字母没有在 s 中出现,那么 distance[i] 可以 忽略 。
如果 s 是一个 匀整 字符串,返回 true ;否则,返回 false 。
示例1:
输入:s = "abaccb", distance = [1,3,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:true
解释:
- 'a' 在下标 0 和下标 2 处出现,所以满足 distance[0] = 1 。
- 'b' 在下标 1 和下标 5 处出现,所以满足 distance[1] = 3 。
- 'c' 在下标 3 和下标 4 处出现,所以满足 distance[2] = 0 。
注意 distance[3] = 5 ,但是由于 'd' 没有在 s 中出现,可以忽略。
因为 s 是一个匀整字符串,返回 true 。
示例 2:
输入:s = "aa", distance = [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:false
解释:
- 'a' 在下标 0 和 1 处出现,所以两次出现之间的字母数量为 0 。
但是 distance[0] = 1 ,s 不是一个匀整字符串。
提示:
这道题目考的是哈希表、数组和字符串,主要是考察哈希表的使用,刚开始看这道题目的时候感觉很绕,我没有看懂,什么每个字母都恰好出现两次,然后又是编号的,然后给出的distance[i]
是第i
个字母的两次出现之间的字母数量,一开始我以为要用双指针,但我仔细看题之后应该是使用哈希映射来跟踪字符串中每个字母的最后出现位置,并计算当前出现位置与每个字母的最后出现位置之间的距离,以检查它是否与输入列表中给定的距离匹配。
我们需要定义一个大小为 26 的整数数组,以跟踪每个字母的第一次出现。然后我们还需要知道两个相同字母之间的距离怎么求,我们可以使用一个变量temp
记录当前的索引位置,用for循环
去遍历字符串,两次相同字母出现距离就是当前位置temp-hash_map[i] - 1
,然后判断这个距离跟题目给我们的distance[i]
的值是否相同。
class Solution:
def checkDistances(self, s: str, distance: list[int]) -> bool:
hash_map = [-1] * 26 # 记录每个字母最后一次出现的位置
temp = 0 # 记录当前位置
for i in s: # 遍历字符串
i = ord(i) - ord('a') # 转换为数字
if hash_map[i] == -1: # 如果当前字母第一次出现
hash_map[i] = temp # 记录当前位置
else: # 如果当前字母不是第一次出现
j = temp - hash_map[i] - 1 # 计算两次出现的距离
if distance[i] != j: # 如果距离不符合要求
return False
temp += 1 # 更新当前位置
return True