跳转至

数组、序列、集合、子串

方法速览

概念 关键词 一句话
数组 定长、连续、下标 固定座次表
序列 有序、可重复 排队(先后有意义)
集合 无序、不重复 去重的口袋
子串 连续的一段 相邻才成串
子序列 保序不连续 抽队不换位
子集 任意选取 与顺序无关

概念对比表

对比项 数组 序列 集合
顺序 有(下标) 有(位置)
重复元素 可有 可有 不可
长度 定义时固定 可增长 看互异元素个数
int a[10] 1, 1, 2, 3 \(\{1, 2, 3\}\)

序列 \(\{1,1,2,3\}\)\(\{1,2,3\}\)不同的两个序列;作为集合则都是 \(\{1,2,3\}\)——“判重”是集合的灵魂。

子串与子序列

子串:原串中连续的一段字符。

  • 长度 n 的字符串,子串(含空串之外的)共 \(\dfrac{n(n+1)}{2}\)按位置数
  • 本质不同(内容互不相同)要去重——重复子串只算一次。

(2022 真题):abcab 的本质不同子串:

长度 子串 个数
1 a, b, c 3
2 ab, bc, ca 3
3 abc, bca, cab 3
4 abca, bcab 2
5 abcab 1

\(3+3+3+2+1 = 12\) 个(按位置共 \(\frac{5\times6}{2} = 15\) 个,其中 abbcabc 各重复一次)。

子序列:从中抽出若干字符、保持相对顺序、不要求连续。

  • abcdeacebd 是子序列,ba(顺序反了)、ac(中间跳过)里 ac 是子序列而 ba 不是;
  • 长度 n 的串,子序列共 \(2^n\) 个(每个字符选或不选,含空序列);
  • 子串一定是子序列,反之不然。

对照abc 中——子串 6 个(a、b、c、ab、bc、abc);子序列 7 个非空(a、b、c、ab、ac、bc、abc):ac 是子序列不是子串。

练习题目

练习 1 · 集合的判重

题目

\(\{1, 2, 2, 3\}\) 作为集合,元素个数是( )

  • A. \(4\)
  • B. \(2\)
  • C. \(3\)
  • D. \(8\)
答案与解析

答案:C

集合元素互异:两个 2 只算一个 → \(\{1,2,3\}\)

练习 2 · 序列与集合的区别

题目

序列 \(1,2,3\)\(3,2,1\)( )

  • A. 相同——元素一样
  • B. 作为序列不同,作为集合也不同
  • C. 作为序列不同,作为集合相同
  • D. 都不对
答案与解析

答案:C

作为序列不同(顺序是序列的一部分);作为集合都是 \(\{1,2,3\}\) 相同。

练习 3 · 数组的特点

题目

数组区别于链表的核心特点是( )

  • A. 只能存整数
  • B. 元素不能重复
  • C. 大小可任意变
  • D. 连续存储、按下标随机访问
答案与解析

答案:D

内存连续 + 下标直达 = \(O(1)\) 随机访问;C 是链表的本领,B 是集合的规矩。

练习 4 · 子串的定义

题目

字符串的“子串”要求( )

  • A. 长度至少为 2
  • B. 任意挑字符但保序
  • C. 必须包含首字符
  • D. 连续的一段字符
答案与解析

答案:D

连续是子串的定义核心;B 描述的是子序列。

练习 5 · 子序列的定义

题目

字符串的“子序列”允许( )

  • A. 重复使用同一位置的字符
  • B. 颠倒顺序
  • C. 跳着选字符但不能颠倒相对顺序
  • D. 必须连续
答案与解析

答案:C

保序 + 不连续;abcba 不是子序列(顺序反了)。

练习 6 · 判子串

题目

对字符串 abcdef,下列是它的子串的是( )

  • A. ace
  • B. bcd
  • C. aec
  • D. fa
答案与解析

答案:B

b、c、d 在原串中连续相邻;A/C 跳选(是子序列);D 顺序颠倒。

练习 7 · 判子序列

题目

对字符串 abcdef,下列是它的子序列的是( )

  • A. bdf
  • B. fed
  • C. fa
  • D. db
答案与解析

答案:A

b、d、f 在原串中先后顺序保持(跳着选合法);其余选项相对顺序与原串相反。

练习 8 · 子串计数(按位置)

题目

长度为 6 的字符串,按位置数(允许内容重复)的子串共( )个。

  • A. \(21\)
  • B. \(36\)
  • C. \(12\)
  • D. \(64\)
答案与解析

答案:A

\(\dfrac{6\times7}{2} = 21\):起点 6 种、终点不超起点,累计求和。

练习 9 · 本质不同子串(小例)

题目

aaa 的本质不同子串有( )个。

  • A. \(6\)
  • B. \(2\)
  • C. \(1\)
  • D. \(3\)
答案与解析

答案:D

按位置有 6 个子串,但内容只有 aaaaaa 三种——重复串只算一次

练习 10 · 本质不同子串(真题变式)

题目

aba 的本质不同子串有( )个。

  • A. \(3\)
  • B. \(6\)
  • C. \(4\)
  • D. \(5\)
答案与解析

答案:D

按长度:1 个字符 {a, b}(2 个);2 个 {ab, ba}(2 个);3 个 {aba}(1 个)→ 共 5。

练习 11 · 子序列计数

题目

长度为 4 的字符串,子序列(含空序列)共( )个。

  • A. \(16\)
  • B. \(15\)
  • C. \(10\)
  • D. \(8\)
答案与解析

答案:A

每个字符选或不选:\(2^4 = 16\);去掉空序列是 15(B)——“含不含空”要审题。

练习 12 · 非空子序列

题目

长度为 5 的字符串,非空子序列至多( )个(假设各不相同)。

  • A. \(31\)
  • B. \(32\)
  • C. \(16\)
  • D. \(15\)
答案与解析

答案:A

\(2^5 - 1 = 31\);若字符有重复,本质不同会更少(题干的“至多”就是这个意思)。

练习 13 · 子串与子序列的关系

题目

“子串”与“子序列”的关系( )

  • A. 互不相关
  • B. 子串一定是子序列,反之不然
  • C. 子序列一定是子串
  • D. 完全等价
答案与解析

答案:B

连续是保序的特例:abcbc 两者都是,ac 只是子序列。

练习 14 · 空串

题目

关于空串(长度为 0 的串)( )

  • A. 不是任何串的子串
  • B. 是任何串的子串(含空串本身)
  • C. 只是不是子序列
  • D. 不存在
答案与解析

答案:B

“连续取 0 个字符”得到的空串是所有串的子串;计数题先看清含不含空

练习 15 · 数组下标

题目

C++ 中 int a[10] 的合法下标范围是( )

  • A. \(1 \sim 10\)
  • B. \(0 \sim 9\)
  • C. \(0 \sim 10\)
  • D. \(1 \sim 9\)
答案与解析

答案:B

C/C++ 数组从 0 编号:a[0] 是第一个,a[10] 越界。

练习 16 · 二维数组寻址

题目

int a[100][100](按行存放),a[i][j] 相对 a 起始处的偏移是( )个 int。

  • A. \(i \times 100 + j\)
  • B. \(i + j \times 100\)
  • C. \(i \times j\)
  • D. \(i + j\)
答案与解析

答案:A

跳过前面 i 整行(每行 100 个)再走 j 个——按行存放就是“先行后列”。

练习 17 · 集合的运算

题目

\(\{1,2,3\} \cup \{3,4\}\)\(\{1,2,3\} \cap \{3,4\}\) 分别是( )

  • A. \(\{1,2,3,4\}\)\(\{3\}\)
  • B. \(\{1,2,3,3,4\}\)\(\{3\}\)
  • C. \(\{1,2,4\}\)\(\{\}\)
  • D. \(\{3\}\)\(\{1,2,3,4\}\)
答案与解析

答案:A

并集合并去重、交集取公共——B 里出现重复元素违反集合定义。

练习 18 · 多重集

题目

允许元素重复出现的“集合”叫多重集。\(\{1,1,2\}\)\(\{1,2\}\)( )

  • A. 无法比较
  • B. 都相同
  • C. 都不同
  • D. 作为多重集不同、作为集合相同
答案与解析

答案:D

多重集把“几个 1”也当信息;普通集合只看有没有。

练习 19 · 前缀与后缀

题目

abcd 的真前缀(不含自身的前缀)共有( )个。

  • A. \(4\)
  • B. \(3\)
  • C. \(2\)
  • D. \(1\)
答案与解析

答案:B

a、ab、abc(abcd 本身不算“真”)——真后缀同理 d、cd、bcd。

练习 20 · 前缀与子串

题目

前缀、后缀与子串的关系( )

  • A. 前缀是子串、后缀不是
  • B. 前缀和后缀都是子串
  • C. 都不是子串
  • D. 后缀是子序列而非子串
答案与解析

答案:B

从开头连续 / 到结尾连续——都是“连续的一段”。

练习 21 · 回文子串

题目

aba 的回文子串有( )个。

  • A. \(5\)
  • B. \(4\)
  • C. \(3\)
  • D. \(2\)
答案与解析

答案:C

子串共 5 个:a、b、ab、ba、aba;其中回文的是 a、b、aba 共 3 个(ab、ba 正反不同)。

练习 22 · 子序列不重复计位置

题目

aab 中子序列 ab 的“取法”有几种?内容互不相同的子序列共几个?( )

  • A. \(2\) 种取法;\(6\)
  • B. \(1\) 种取法;\(3\)
  • C. \(2\) 种取法;不同子序列 \(5\)
  • D. \(1\) 种取法;\(5\)
答案与解析

答案:C

两个 a 任选其一与 b 组成 ab(2 种取法);不同子序列:a、b、aa、ab、aab 共 5 个。

练习 23 · 数组存字符串

题目

char s[] = "abc"; 数组 s 的长度(含结束符)是( )

  • A. \(3\)
  • B. \(4\)
  • C. \(2\)
  • D. \(5\)
答案与解析

答案:B

'a','b','c','\0'——结束符占一格;strlen(s) = 3sizeof(s) = 4 差一。

练习 24 · 序列的子序列辨析

题目

序列 \(1, 2, 3, 4, 5\) 中,\(2, 4\)\(4, 2\)( )

  • A. 都是子序列
  • B. 都不是
  • C. 后者是子序列、前者不是
  • D. 前者是子序列、后者不是
答案与解析

答案:D

2 在 4 前面(保序 ✓);4 在 2 后面取出来顺序颠倒 ✗。

练习 25 · 概念综合

题目

下列说法错误的是( )

  • A. 集合中的元素互不相同
  • B. 子串必须连续
  • C. 子序列必须连续
  • D. 数组支持下标随机访问
答案与解析

答案:C

子序列恰恰不要求连续,只要求保序。

练习 26 · 计数综合

题目

ab 的:子串(按位置)、子序列(含空)、集合(字符集)分别是( )

  • A. \(3\)\(4\)\(\{a,b\}\)
  • B. \(4\)\(4\)\(\{a,b\}\)
  • C. \(3\)\(3\)\(\{a,b\}\)
  • D. \(2\)\(4\)\(\{a,b\}\)
答案与解析

答案:A

子串 a、ab、b 共 3;子序列 \(\emptyset\)、a、b、ab 共 \(2^2 = 4\);字符集 \(\{a,b\}\) 2 个——同一串三种数法全不同。

历年真题

2022 年 · 第 14 题

题目

一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串 abcab 有( )个内容互不相同的子串。

  • A. \(12\)
  • B. \(13\)
  • C. \(14\)
  • D. \(15\)
答案与解析

答案:A

按长度枚举再去重(完整表格见“子串与子序列”一节):

长度 列出 互异个数
1 a, b, c 3
2 ab, bc, ca 3
3 abc, bca, cab 3
4 abca, bcab 2
5 abcab 1

共 12。按位置数是 \(\frac{5\times6}{2} = 15\) 个(D 的来源),其中 abbcabc 因串内重复各被多数一次——“本质不同”= 位置数 − 重复

易错小结

  • 子串连续、子序列保序不连续;子串 ⊂ 子序列;
  • n 长串按位置的子串 \(\dfrac{n(n+1)}{2}\) 个、子序列 \(2^n\) 个(含空);本质不同要再去重(2022 真题 15 → 12);
  • 集合无序不重复;多重集才计重复个数;
  • C++ 数组下标 \(0 \sim n-1\);二维按行存放偏移 \(i\times\text{列数} + j\)
  • sizeof("abc") = 4(含 '\0')、strlen = 3
  • 审题三连:含不含空?按位置还是按内容?重复算不算?