算法要求

给你一个字符串 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)