📜  门| GATE-CS-2016(Set 1)|问题1(1)

📅  最后修改于: 2023-12-03 14:58:30.799000             🧑  作者: Mango

GATE-CS-2016(Set 1) - Question 1

本题要求我们实现一个 最长连续数字子串 的函数。在这里,最长连续数字子串是指,一个字符串中由数字字符组成,且数字字符在字符串上是连续的、且长度最长的子串。

算法实现思路

一个直观的想法是使用两个指针 $p_1, p_2$ 标记子串的起始和终止,然后分三种情况讨论:

  1. 如果当前位置是数字字符,$p_2$ 指向当前位置;
  2. 如果当前位置是非数字字符,$p_1$ 指向当前位置,$p_2$ 跳到下一个位置;
  3. 每次更新当前的最长子串,并让 $p_1$ 指向当前位置。

具体的实现细节可以参见代码实现。

代码实现
def longest_continuous_digit_substring(s: str) -> str:
    p1, p2 = 0, 0
    longest_substring = ''
    while p2 < len(s):
        if s[p2].isdigit():
            p2 += 1
        else:
            if p2 - p1 > len(longest_substring):
                longest_substring = s[p1:p2]
            p1 = p2 = p2 + 1
    if p2 - p1 > len(longest_substring):
        longest_substring = s[p1:p2]
    return longest_substring
测试用例

我们可以使用一些测试用例来检验实现的正确性。例如:

assert longest_continuous_digit_substring('abc123defg456hij') == '456'
assert longest_continuous_digit_substring('a1b2c3d4e5f6g7h8i9j') == '123456789'
assert longest_continuous_digit_substring('123') == '123'
assert longest_continuous_digit_substring('') == ''
assert longest_continuous_digit_substring('abc') == ''
assert longest_continuous_digit_substring('0123456789') == '0123456789'
时间复杂度

整个算法只对字符串遍历了一次,因此时间复杂度为 $\Theta(n)$。

空间复杂度

由于只存储了一个字符串和三个整数变量,因此空间复杂度为 $\Theta(1)$。