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

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

代表数字的字符串的所有子字符串的总和|第2组(恒定的额外空间)
问题描述

给定一个字符串,该字符串表示数字(例如,“123”表示数字123),要求找出该数字的所有子串,并返回所有子串的总和作为输出。

输入格式

一个字符串,长度不超过10^5。

输出格式

代表数字的字符串的所有子字符串的总和。

解题方法

本题要求求出所有子串的和,因此首先需要明确什么情况下一个字符串才是代表数字的字符串:

  1. 如果字符串中包含一个或多个0,则该字符串不是代表数字的字符串。
  2. 如果字符串的第一个字符是正负号,则该字符串只有第一个字符可以是正负号,其他字符必须是数字。
  3. 如果字符串的第一个字符不是正负号,则字符串中只能包含数字。

因此,可以使用一个指针i来遍历字符串中的每个字符,同时使用两个指针j和k来维护当前子串的开始和结束位置。对于每个i,从i开始向右扫描字符串,直至扫描到一个不是数字的字符为止。在扫描的过程中需要关注以下情况:

  1. 如果当前字符是正负号,则需要判断当前字符是否是子串的第一个字符。如果不是,则说明该字符串不符合要求;如果是,则需要将j指向i+1。
  2. 如果当前字符不是正负号,则需要判断当前字符是否是子串的第一个字符,如果是,则需要将j指向i;如果不是,则保持j不变。
  3. 如果当前字符是0,则需要判断当前字符是否是子串的第一个字符。如果是,则说明该字符串不符合要求;如果不是,则将k指向当前字符。

在扫描完子串之后,将子串转换为数字,并累加到总和中。

代码实现
def substrings_sum(s):
    res = 0
    i = 0
    while i < len(s):
        j = i
        k = i
        if s[i] == '+' or s[i] == '-':
            if i == len(s) - 1 or not s[i+1].isdigit():
                i += 1
                continue
            j = i + 1
        while k < len(s) - 1 and s[k+1].isdigit():
            k += 1
        if j == i and s[i] == '0':
            i += 1
            continue
        if j <= k:
            res += int(s[j:k+1])
        i = k + 1
    return res
时间复杂度

本算法采用了线性遍历字符串的方法,时间复杂度为O(n)。

空间复杂度

本算法使用了常数个变量来存储中间结果,因此空间复杂度为O(1)。

总结

本题虽然看似简单,但是需要掌握一定的字符串处理技巧和数字的转换方法。在实现过程中需要注意各种边界条件的判断,才能保证程序的正确性。