📌  相关文章
📜  可以使用超出范围的字符来形成范围为[L,R]的子字符串的方式的数目(1)

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

可以使用超出范围的字符来形成范围为[L,R]的子字符串的方式的数目

在字符串处理中,有时候需要计算范围为[L,R]的子字符串的个数,但是如果直接暴力计算,时间复杂度将会非常高。此时,可以采用一种巧妙的方法,即使用超出范围的字符来形成子字符串,从而提高计算效率。 以下是这种方法的具体实现:

def countSubstrings(s: str, L: int, R: int) -> int:
    # 在字符串s的左右分别添加超出范围的字符
    s = '#' + s + '@'
    n = len(s)
    ans = 0
    for i in range(1, n):
        for j in range(i, n):
            # 判断子串是否在[L,R]的范围内
            if L <= ord(s[j]) - ord(s[i-1]) <= R:
                ans += 1
            else:
                break
    return ans

上述代码中,ord()函数是将字符转换成其ASCII码值。countSubstrings()函数将字符串s的左右两侧分别添加了超出范围的字符,以方便后续计算。然后,通过两重循环遍历所有子串,并且判断子串是否在[L,R]的范围内。如果符合要求,则计数器ans加1。如果不符合要求,则跳出循环。 这种方法时间复杂度为$O(n^2)$,比暴力计算要高效很多。如果要进一步优化,可以使用滑动窗口来替代两重循环。

参考链接:

  • https://leetcode.com/problems/count-number-of-substrings-with-abc/
  • https://www.cnblogs.com/tonysk/p/6489682.html