数据结构与算法##4.字符串
一、基本概念
元素为字符的线性表
空串不等于空格串
通常以串的整体作为操作对象
线性表的存储方法同样适用于字符串
应根据不同情况选择合适的存储表示
字符:组成字符串的基本单位 char
编码方式:ASCII, GB, CJK, UNICODE
编码表一般遵循约定俗成的偏序编码规则
字符偏序:根据字符的自然含义,某些字符间两两可以比较次序
字符串数据类型:
- 根据语言不同:简单类型和复杂类型
- 字符串常数和字符串变量
子串的定义
空串是任意串的子串
任意串都是其自身的子串
真子串:非空且不为自身的子串
基本运算
#include <string.h>
- 求串长 int strlen(char *s);
- 串复制 char *strcpy(char *s1, char *s2);
- 串拼接 char *strcat(char *s1, char *s2);
- 串比较 int strcmp(char *s1, char *s2);
- 定位 char *strchr(char *s, char c);
- 右定位 char *strrchr(char *s, char c);
- 求子串 char *strstr(const char *str1, const char *str2);
#include <string>
- 子串 substr()
- 拷贝 copy()
- 交换 swap()
- 赋值 assign(), =
- 插入 insert(), append(), +=
- 拼接 +
- 查询 find(), rfind()
- 替换 replace()
- 清除 clear()
- 统计 size()/legth(), max_size()
得到字符串中的字符:
重载 []
二、存储结构
1.顺序存储
对串长变化不大的字符串:
- 用s[0]作为记录串长的存储单元 <=256
- 为存储串长开辟新的存储地方 串最大长度一般静态给定,不是动态申请
- 末尾加\0
2.模式匹配
在大文本中定位(查找)特定的模式
朴素模式匹配:一次移动一格
O(mn)
KMP算法
k值仅依赖于模式P本身,而与目标对象T无关
特征向量N(next数组)
在s[k]停住了就让s[k]和p[next[j]]对应上
O(m+n)