📅  最后修改于: 2023-12-03 15:11:54.983000             🧑  作者: Mango
给定一个字符串,其中每个字符都表示一个数字('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)$。该算法具有较高的时间效率和空间效率。