第03章 串(java版)1. 第 3 章 串
? 3.1 串抽象数据类型
? 3.2 串的表示和实现
? 3.3 串的模式匹配
3. 《数据结构( Java 版)(第 3 版)》
3.1 串抽象数据类型
3.1.1 串的基本概念
1. 串定义。 s= " "
2. 子串。 "at" 是 "data" 的子串。
3. 串比较。
两个串可比较是否相等,也可比较大小。
110 ?nsss ?
4. 《数据结构( Java 版)(第 3 版)》
public interface SString
{ int length(); // 返回串的长度
char charAt(int i) // 返回第 i ( i≥0 )个字
符
SString concat(SString str); // 返回与 str 串连接生成
串
SString substring(int begin, int end);
// 返回串中字符序号从 begin 至 end-1 的
子串
void setCharAt(int i, char ch) // 设置第 i 个字符为
ch
SString insert(int i, SString str)// 在第 i 个字符处插入
str 串
3.1.2 串抽象数据类型
5. 《数据结构( Java 版)(第 3 版)》
3.2 串的表示和实现
3.2.1 串的存储结构
3.2.2 字符串类 String
3.2.3 字符串类 StringBuffer
7. 《数据结构( Java 版)(第 3 版)》
3.2.2 常量字符串类 String
1. String 类声明
public final class MyString implements
Comparable<MyString>,java.io.Serializable
{
private final char[] value;
// 字符数组,私有最终变量,只能赋值一
次
}
13. 《数据结构( Java 版)(第 3 版)》
( 2 )删除串中序号从 begin
至 end-1 的子串
【例 3.2 】获得一个整数的二进制或十六
进制形式字符串。
14. 《数据结构( Java 版)(第 3 版)》
3.2.3 变量字符串类
StringBuffer
public final class MyStringBuffer
implements java.io.Serializable
{
private char[] value; // 字符数
组
private int len; // 串长
度
}
26. 《数据结构( Java 版)(第 3 版)》
3. 求 next 数组
表 3-1 模式串 "abcabc" 的 next 数组
j 0 1 2 3 4 5
模式串 a b c a b c
" " 中最长相
同前后缀子串的长度
k
?1 0 0 0 1 2
0 1 1
1 0
[ ]
0?? ?? ????" ... " " ... "??×??ó ????k j k j
j
next j
k k j p p p p? ? ?
? =??
= ?
=??
4. KMP 算法实现
110 ?jppp ?
27. 《数据结构( Java 版)(第 3 版)》
5. 计算 next 数组的递推算
法
表 3-2 模式串 "abcabdabcabcaa" 的 next
数组
"
j 0 1 2 3 4 5 6 7 8 9 10 11 12 13
模式串 a b c a b d a b c a b c a a
"p0…pj?1" 中最长
相同的前后缀子串
长度 k
-1 0 0 0 1 2 0 1 2 3 4 5 3 4
29. 《数据结构( Java 版)(第 3 版)》
6. 改进 next 数组
表 3-3 模式串 "abcabc" 改进的 next 数组
j 0 1 2 3 4 5
模式串 a b c a b c
"p0
…pj?1
" 中最长相同的前
后缀子串长度 k
?1 0 0 0 1 2
pk
与 pj
比较 ≠ ≠ = = =
改进的 next[j] ?1 0 0 ?1 0 0
32. 《数据结构( Java 版)(第 3 版)》
表 3-4 模式
串 "abcabdabcabcaa" 改进的
next 数组
j 0 1 2 3 4 5 6 7 8 9 10 11 12 13
模式
串
a b c a b d a b c a b c a a
串长 k -1 0 0 0 1 2 0 1 2 3 4 5 3 4
比较 ≠ ≠ = = ≠ = = = = = ≠ = ≠
改进
的
next[j]
-1 0 0 -1 0 2 -1 0 0 -1 0 5 -1 4