算法要求
给你一个字符串 s
。一个字符串的 分数 定义为相邻字符 ASCII 码差值绝对值的和。
请你返回 s
的 分数 。
示例 1:
输入:s = "hello"
输出:13
解释:
s 中字符的 ASCII 码分别为:'h' = 104 ,'e' = 101 ,'l' = 108 ,'o' = 111 。所以 s 的分数为 |104 - 101| + |101 - 108| + |108 - 108| + |108 - 111| = 3 + 7 + 0 + 3 = 13 。
示例 2:
输入:s = "zaz"
输出:50
解释:
s 中字符的 ASCII 码分别为:'z' = 122 ,'a' = 97 。所以 s 的分数为 |122 - 97| + |97 - 122| = 25 + 25 = 50 。
提示:
2 <= s.length <= 100
s
只包含小写英文字母。
算法代码
class Solution:
# 定义一个名为 Solution 的类,在 Python 里,类可用来封装相关的方法和属性
def scoreOfString(self, s: str) -> int:
# 定义一个名为 scoreOfString 的方法,它接收一个字符串 s 作为参数,并且返回一个整数
return sum(abs(x-y) for x,y in pairwise(map(ord, s)))
# 1. map(ord, s):
# - map 函数会对可迭代对象 s 里的每个元素运用 ord 函数。
# - ord 函数的作用是返回一个字符的 ASCII 码值。
# - 所以 map(ord, s) 会把字符串 s 里的每个字符转换为对应的 ASCII 码值,形成一个可迭代对象。
# 2. pairwise(map(ord, s)):
# - pairwise 函数(此函数来自 itertools 模块)会将可迭代对象中的元素两两配对。
# - 例如,对于可迭代对象 [a, b, c],pairwise([a, b, c]) 会返回 [(a, b), (b, c)]。
# - 因此 pairwise(map(ord, s)) 会把字符串 s 中相邻字符的 ASCII 码值两两配对。
# 3. abs(x - y) for x, y in pairwise(map(ord, s)):
# - 这是一个生成器表达式,会对每一对相邻字符的 ASCII 码值求差,然后取绝对值。
# 4. sum(...):
# - sum 函数会把生成器表达式里的所有绝对值累加起来,最终返回累加结果。
复杂度分析
时间复杂度:O(n),这里的 n 是字符串
s
的长度。因为需要遍历字符串一次,且每次操作的时间复杂度都是常数级的。空间复杂度:O(n) ,主要是因为
map(ord, s)
和pairwise(map(ord, s))
这些操作会产生临时的可迭代对象,它们的空间复杂度是 O(n) 。