串与子串

46°C 25-12-2024 notbyai
最近更新于:2024-12-26 13:45:57

一、 串(字符串)

  • 定义:串是一系列字符按照一定顺序组成的有限序列。
    例如:
    "hello" 是由字符 h, e, l, l, o 组成的一个序列。
  • 特性
  • 串中的字符是有序的。
  • 串的长度是字符的个数,包括空格、标点符号等。
  • 串可以是空串(长度为 0),记为 ""
  • 表示形式
  • 数学上,字符串常写作 S = “abcd”
  • 编程中,字符串可能用双引号 " 或单引号 ' 表示,例如:"hello"'world'

二、 子串

  • 定义:子串是从一个给定字符串(称为母串)中连续选取若干字符组成的序列。
    例如:
    对于字符串 "hello",以下是一些合法的子串:
  • "h"
  • "he"
  • "ell"
  • "hello"
  • 特性
  • 连续性:子串的字符必须是母串中一段连续的字符。
    • 例如:在 "hello" 中,"he" 是子串,但 "ho" 不是子串(因为不连续)。
  • 空子串:空串 "" 是任何字符串的子串。
  • 子串的长度必须小于等于母串长度。

三、 区别:串与子串

特性子串
定义字符的一个完整序列母串中某些连续字符的序列
范围是一个完整的独立对象是基于某个母串的一个部分
连续性要求无连续性要求(整个串就是连续的)必须是母串中连续的一部分
长度限制没有限制,视具体情况而定小于或等于母串的长度

四、 求串中子串的个数

在一个字符串中,子串的总数包含了所有可能的子串,包括空串

1. 如何计算子串的个数

假设一个字符串的长度为 n ,那么子串的总数计算如下:

  1. 非空子串的个数
  • 对于一个长度为 n 的字符串,每个字符都可以是子串的起点,每个起点可以有不同长度的子串。
  • 如果我们固定起点,从起点出发的子串数量为:
  • 对所有起点求和,可以得到总的非空子串数:
  1. 加上空串
  • 空串也是子串之一。因此,子串总数为:

2. 公式总结

对于长度为 n 的字符串,包含空串在内的子串总数为:

3. 举例说明

  1. 字符串:”abc”
  • 长度 n = 3
  • 非空子串的总数:
  • 空串的个数:1
  • 总子串数:6 + 1 = 7
  • 子串列表:["", "a", "b", "c", "ab", "bc", "abc"]
  1. 字符串:”abcd”
  • 长度 n = 4
  • 非空子串的总数:
  • 空串的个数: 1
  • 总子串数: 10 + 1 = 11
  • 子串列表:["", "a", "b", "c", "d", "ab", "bc", "cd", "abc", "bcd", "abcd"]

4. 算法实现

伪代码:

function countSubstrings(string):
    n = length(string)
    total = (n * (n + 1)) / 2  # 非空子串的总数
    return total + 1           # 加上空串

Python代码:

def count_substrings(s):
    n = len(s)
    return (n * (n + 1)) // 2 + 1

# 示例
print(count_substrings("abc"))  # 输出: 7
print(count_substrings("abcd"))  # 输出: 11

5. 复杂度分析

  • 公式的推导和实现都是基于字符串长度 n ,没有涉及子串的具体生成。
  • 因此,时间复杂度为 O(1) ,空间复杂度也为 O(1)

五、 扩展:子串 vs 子序列

很多人会混淆“子串”和“子序列”,但二者有重要区别:

  • 子串:必须是母串中连续的字符。
  • 子序列:不要求连续,只需要保持字符的相对顺序。
  • 例如:对于字符串 "hello"
    • 子串包括:"he", "ell", "hello"
    • 子序列包括:"hlo", "eo", "ho"(不连续也可以)。

六、 总结

  • 是字符的一个完整有序序列。
  • 子串 是从串中连续取出的一部分。
  • 子串在数学和编程中广泛应用,它的连续性特性使其区别于子序列。

评论留言

欢迎您,!您可以在这里畅言您的的观点与见解!

0 条评论