📌  相关文章
📜  表示数字的字符串的所有子字符串的总和 |套装 2(恒定额外空间)(1)

📅  最后修改于: 2023-12-03 15:11:54.983000             🧑  作者: Mango

以表示数字的字符串的所有子字符串的总和 |套装 2(恒定额外空间)

问题描述

给定一个字符串,其中每个字符都表示一个数字('0'到'9'之间的数字),请编写一个函数来计算字符串中所有可能的子字符串的总和。

示例
输入: "123"
输出: 164
解释: 可能的子字符串为 "1"、"2"、"3"、"12"、"23"、"123",它们的和为 1 + 2 + 3 + 12 + 23 + 123 = 164。
解题思路

本题可以使用类似于前缀和的方法来解决,通过每次遍历当前位置和前一个位置之间的数字,计算出以当前位置结尾的所有子字符串的和,并将其累加到结果中。

具体而言,我们可以使用一个变量 res 来维护结果,一个变量 cur 来维护以当前位置结尾的所有子字符串的和(初始为 0)。然后,我们从左到右遍历字符串,对于遍历到的每个位置,我们使用公式 cur = cur * 10 + (s[i] - '0') 将当前位置的数字加入到 cur 中,然后将 cur 加入到 res 中,最后返回 res 即可。

代码实现
def sum_substring(s: str) -> int:
    res, cur = 0, 0
    for i in range(len(s)):
        cur = cur * 10 + (ord(s[i]) - ord('0'))
        res += cur
    return res
总结

本题的时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。该算法具有较高的时间效率和空间效率。