一、 串(字符串)
- 定义:串是一系列字符按照一定顺序组成的有限序列。
例如:
串"hello"
是由字符h
,e
,l
,l
,o
组成的一个序列。 - 特性:
- 串中的字符是有序的。
- 串的长度是字符的个数,包括空格、标点符号等。
- 串可以是空串(长度为 0),记为
""
。 - 表示形式:
- 数学上,字符串常写作 S = “abcd” 。
- 编程中,字符串可能用双引号
"
或单引号'
表示,例如:"hello"
或'world'
。
二、 子串
- 定义:子串是从一个给定字符串(称为母串)中连续选取若干字符组成的序列。
例如:
对于字符串"hello"
,以下是一些合法的子串: "h"
"he"
"ell"
"hello"
- 特性:
- 连续性:子串的字符必须是母串中一段连续的字符。
- 例如:在
"hello"
中,"he"
是子串,但"ho"
不是子串(因为不连续)。
- 例如:在
- 空子串:空串
""
是任何字符串的子串。 - 子串的长度必须小于等于母串长度。
三、 区别:串与子串
特性 | 串 | 子串 |
---|---|---|
定义 | 字符的一个完整序列 | 母串中某些连续字符的序列 |
范围 | 是一个完整的独立对象 | 是基于某个母串的一个部分 |
连续性要求 | 无连续性要求(整个串就是连续的) | 必须是母串中连续的一部分 |
长度限制 | 没有限制,视具体情况而定 | 小于或等于母串的长度 |
四、 求串中子串的个数
在一个字符串中,子串的总数包含了所有可能的子串,包括空串。
1. 如何计算子串的个数
假设一个字符串的长度为 n ,那么子串的总数计算如下:
- 非空子串的个数:
- 对于一个长度为 n 的字符串,每个字符都可以是子串的起点,每个起点可以有不同长度的子串。
- 如果我们固定起点,从起点出发的子串数量为:

- 对所有起点求和,可以得到总的非空子串数:

- 加上空串:
- 空串也是子串之一。因此,子串总数为:

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

3. 举例说明
- 字符串:”abc”
- 长度 n = 3 。
- 非空子串的总数:

- 空串的个数:1
- 总子串数:6 + 1 = 7 。
- 子串列表:
["", "a", "b", "c", "ab", "bc", "abc"]
。
- 字符串:”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 条评论