当前位置:文档之家› 数据结构第三章字符串

数据结构第三章字符串



子串:串中任意个连续的字符组成的子序列。 主串:包含子串的串。 子串的位置:子串的第一个字符在主串中的序号。
S1="ab12cd " S2="ab12" S3="ab13" S4="ab12φ" S5=" " S6="φφφ "

串的比较:通过组成串的字符之间的比较来进行的。
给定两个串:X="x1x2…xn"和Y="y1y2…ym",则: 1. 当n=m且x1=y1,…,xn=ym时,称X=Y; 2. 当下列条件之一成立时,称X<Y: ⑴ n<m且xi=yi(1≤ i≤n); ⑵存在k≤min(m,n),使得xi=yi(1≤i≤k-1)且xk<yk。 例:S1="ab12cd ",S2="ab12",S3="ab13"

例:主串S="ababcabcacbab",模式T="abcac"
i
第 4 趟
a b a b c a b c a c b a b a b c a c
j
i=4,j=1失败 i回溯到5,j回溯到1
Hale Waihona Puke 串例:主串S="ababcabcacbab",模式T="abcac"
i
第 5 趟
a b a b c a b c a c b a b a b c a c
为什么BF算法时间性能低?
在每趟匹配不成功时存在大量回溯,没有利用已经 部分匹配的结果。
如何在匹配不成功时主串不回溯?
主串不回溯,模式就需要向右滑动一段距离。
如何确定模式的滑动距离?
串 i
第 1 趟
a b a b c a b c a c b a b a b c a c
j
i=3,j=3失败; s2=t2;t1≠t2 ∴t1≠s2

⑺ StrInsert (s, i, t):插入,将串t插入到串s中的第i个 位置。 ⑻ StrDelete (s, i, len):删除,在串s中删除从第i个字 符开始的连续len个字符。 ⑼ StrRep (s, t, r):替换,在串s中用串r替换所有与串t 相等的子串。 与其他数据结构相比,串的操作对象有什么特点? 串的操作通常以串的整体作为操作对象。
最坏情况:不成功的匹配都发生在串T的最后一个字符。
设匹配成功发生在si处,则在i-1趟不成功的匹配中共 比较了(i-1)×m次,第i趟成功的匹配共比较了m次, 所以总共比较了i×m次,因此
n - m +1
m(n - m + 2) = O(n m) pi (i m) = 2 i =1

int BF(char S[ ], char T[ ]) { i=1; j=1;start=1; while (i<=S[0]&&j<=T[0]) { if (S[i]==T[j]) { i++; j++; } else { start++; i=start; j=1; } } if (j>T[0]) return start; else return 0; }

⑴ StrLength (s):求串s的长度。 ⑵ StrAssign (s1, s2):赋值,将s2的值赋值给串s1。 ⑶ StrConcat (s1, s2, s):连接,将串s2放在串s1的后 面连接成一个新串s。 ⑷ SubStr (s, i, len):求子串,返回从串s的第i个字符 开始取长为 len 的子串。 ⑸ StrCmp (s1, s2):串比较,若s1=s2,返回0;若 s1<s2, 返回-1;若s1>s2, 返回1。 ⑹ StrIndex (s, t):定位,返回子串t在主串s中首次 出现的位置。若t不是s的子串,则返回0。

顺序串:用数组来存储串中的字符序列。
如何改造数组实现串的顺序存储? (1)非压缩形式。 (2)压缩形式。
启示:时空权衡!
a e b f c g d

如何表示串的长度? 方案1:用一个变量来表示串的实际长度。
0
1
2
3
4
5
6 … … Max-1
a b c d e f
g
空 闲
9

如何表示串的长度? 方案1:用一个变量来表示串的实际长度。 方案2:在串尾存储一个不会在串中出现的特殊字符 作为串的终结符,表示串的结尾。

求子串操作SubStr(s, i, len)示例 i = 3, len = 3 i = 7, len = 4
a b c d e f g e
a b c d e f g e
空串
c d e
g e

顺序串:用数组来存储串中的字符序列。
如何改造数组实现串的顺序存储? (1)非压缩形式。
a
b
c
d
e
f
g
0
1
2
3
4
5
6
7 … … Max-1 空 闲
a
b
c
d
e
f
g \0

如何表示串的长度? 方案1:用一个变量来表示串的实际长度。 方案2:在串尾存储一个不会在串中出现的特殊字符 作为串的终结符,表示串的结尾。 方案3:用数组的0号单元存放串的长度,从1号单 元开始存放串值。 0 1 2 3 4 5 6 7……
⑴ 算法的一次执行时间不容忽视:问题规模通常很 大,常常需要在大量信息中进行匹配; ⑵ 算法改进所取得的积累效益不容忽视:模式匹配 操作经常被调用,执行频率高。

i
回溯
i
主串S …
模式T
si
……
tj
j
回溯
j

i
主串S …
模式T
si
……
tj
j

i
主串S …
模式T
si
……
tj
j

例:主串S="ababcabcacbab",模式T="abcac"
第 2 趟
a b a b c a b c a c b a b
a b c a c
串 i
第 1 趟
a b a b c a b c a c b a b a b c a c
j
i=3,j=3失败; s2=t2;t1≠t2 ∴t1≠s2
第 3 趟
a b a b c a b c a c b a b a b c a c
i i i
第 1 趟
j
a b a b c a b c a c b a b a b c a c
j j
i=3,j=3失败; i回溯到2,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
i
第 1 趟
j
a b a b c a b c a c b a b a b c a c
i=3,j=3失败; i回溯到2,j回溯到1

设串S长度为n,串T长度为m,在匹配成功的情况 下,考虑两种极端情况:
⑴ 最好:不成功的匹配都发生在串T的第一个字符。 例如:S="aaaaaaaaaabcdccccc" T="bcd "

设串S长度为n,串T长度为m,在匹配成功的情况 下,考虑两种极端情况:
最好情况:不成功的匹配都发生在串T的第1个字符。 设匹配成功发生在si处,则在i-1趟不成功的匹配中共 比较了i-1次,第i趟成功的匹配共比较了m次,所以 总共比较了i-1+m次,所有匹配成功的可能情况共有 n-m+1种,则:
j
i=7,j=5失败 s5=t3;t1≠t3 ∴t1≠s5
第 5 趟
a b a b c a b c a c b a b a b c a c
串 i
第 3 趟
a b a b c a b c a c b a b a b c a c
j
i=7,j=5失败 s5=t3;t1≠t3 ∴t1≠s5
第 6 趟
a b a b c a b c a c b a b a b c a c
j
i=5,j=1失败 i回溯到6,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
i
第 5 趟
a b a b c a b c a c b a b a b c a c
j
i=5,j=1失败 i回溯到6,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
j
i=2,j=1失败 i回溯到3,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
i i i i i
第 3 趟
a b a b c a b c a c b a b a b c a c
j j j j j
i=7,j=5失败 i回溯到4,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
i
第 3 趟
a b a b c a b c a c b a b a b c a c
j
i=7,j=5失败 i回溯到4,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
相关主题