版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第四章串※教學(xué)內(nèi)容:串的邏輯結(jié)構(gòu),存儲結(jié)構(gòu);串操作的實現(xiàn)※教學(xué)重點:串的七種基本運算的定義,利用這些基本運算來實現(xiàn)串的其它各種運算的方法;在順序存儲結(jié)構(gòu)和在堆存儲結(jié)構(gòu)上實現(xiàn)串的各種操作的方法;KMP算法,熟悉NEXT函數(shù)和改進NEXT函數(shù)的定義和計算?!虒W(xué)難點:KMP算法,手工計算NEXT函數(shù)和改進
NEXT函數(shù)的值。串類型的定義串的表示和實現(xiàn)串的模式匹配算法第四章
串4.1
串類型的定義一、串的定義二、串的抽象數(shù)據(jù)類型的定義一、串的定義串(string)(或字符串),是由零個或多個字符組成的有限序列。一般記為s=‘a(chǎn)1a2a3…an’
(n≥0)其中,s是串名,單引號括起來的字符序列是串的值;ai可以是字母,數(shù)字或其他字符;串中的字符個數(shù)稱為串的長度;零個字符的串稱為空串(Null
string),其長度為零;
串中任意個連續(xù)的字符組成的子序列稱為該串的子串;包含子串的串相應(yīng)地稱為主串;字符在序列中的序號為該字符在串中的位置;子串在主串中的位置則以子串的第一個字符在主串中的位置來表示;由一個或多個空格字符組成的串稱為空格串;例:串a(chǎn),b,c,d,e五個串如下:a=“very
difficult”;b=“
”;c=“”;d=“very”;e=“difficult”;串a(chǎn)的長度為
;串b是長度為
的空格串;串c是空串,長度為
;串d和e是串a(chǎn)的子串,串d在串a(chǎn)中的位置是
,串e在串a(chǎn)中的位置是
。串相等:當(dāng)且僅當(dāng)兩個串的值相等,即只有當(dāng)兩個串的長度相等,并且各個對應(yīng)位置的字符都相等時才相等;空串是任意串的子串;任意串又是自己的子串注意:⑴串值必須用一對單引號括起來,但單引號本身不屬于串;⑵空串與空格串截然不同,空串不包含任何字符。二、串的抽象數(shù)據(jù)類型的定義如下:ADT
String
{數(shù)據(jù)對象:D={
ai
|ai∈CharacterSet,i=1,2,...,n, n≥0
}數(shù)據(jù)關(guān)系:R1={
<ai-1,
ai
>
|ai-1,
ai
∈D,i=2,...,n
}基本操作:SubString
(&Sub,
S,
pos,
len)ClearString
(&S)Index
(S,
T,pos)Replace
(&S,
T,
V)StrInsert
(&S,
pos,
T)StrDelete
(&S,
pos,
len)StrAssign
(&T,
chars)DestroyString(&S)StrCopy
(&T,
S)StrLength(S)StrCompare
(S,
T)Concat
(&T,
S1,
S2)StrEmpty
(S)}
ADT
StringStrAssign
(&T,
chars)初始條件:chars是字符串常量。操作結(jié)果:把chars賦為T
的值。StrCopy
(&T,
S)初始條件:串S
存在。操作結(jié)果:由串S
復(fù)制得串T。DestroyString
(&S)初始條件:串S
存在。操作結(jié)果:串S
被銷毀。StrEmpty
(S)初始條件:串S存在。操作結(jié)果:若S
為空串,則返回TRUE;否則返回FALSE。
表示空串,空串的長度為零。StrCompare
(S,
T)初始條件:串S
和T
存在。操作結(jié)果:若S
T,則返回值
0;若S
T,則返回值
0;
若S
T,則返回值
0。StrLength
(S)初始條件:串S
存在。操作結(jié)果:返回S
的元素個數(shù),稱為串的長度。Concat
(&T,
S1,
S2)初始條件:串S1
和S2
存在。操作結(jié)果:用T
返回由S1
和S2聯(lián)接而成的新串。SubString
(&Sub,
S,
pos,
len)初始條件:串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1。操作結(jié)果:用Sub
返回串S的第pos
個字符起長度為len的子串。子串為“串”中的一個字符子序列例如:SubString(
sub,
command
,
4,3)求得
sub
=
man
SubString(
sub,
command
,
1,7)求得
sub
=
command
SubString(
sub,
command
,7,1)求得
sub
=
d
SubString(sub,
commander
,
4,
7)sub
=
?SubString(
student
,
5,
0)
=SubString(sub,
beijing
,
7,
2)
=
?sub
=
?起始位置和子串長度之間存在約束關(guān)系長度為0
的子串為“合法”串
Index
(S,
T,
pos)初始條件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。操作結(jié)果:若主串S
中存在和串T
值相同的子串,則返回T在主串S
中第pos個字符之后第一次出現(xiàn)的位置;否則函數(shù)值為0。“子串在主串中的位置”意指子串中的第一個字符在主串中的位序。假設(shè)S
=
abcaabcaaabc
, T
=
bca
Index(S,
T,
1)
=2Index(S,
T,
3)
=6Index(S,
T,
8)
=0Replace
(&S,
T,
V)初始條件:串S,T和V
均已存在,且T
是非空串。操作結(jié)果:用V替換主串S中出現(xiàn)的所有與(模式串)T相等的不重疊的子串。例如Replace
(&S,T,V):假設(shè)S=
abcaabcaaabca
,T=
bca
若V=
x
,則經(jīng)置換后得到S
=
axaxaax
若V=
bc
,則經(jīng)置換后得到S
=
abcabcaabc
StrInsert
(&S,
pos,
T)初始條件:串S和T存在,1≤pos≤StrLength(S)+1。操作結(jié)果:在串S的第pos個字符之前插入串T。例如:
S
=
chater
,T
=
rac
,則執(zhí)行
StrInsert(S,4,
T)之后得到S
=
character
StrDelete
(&S,
pos,
len)初始條件:串S存在1≤pos≤StrLength(S)-len+1。操作結(jié)果:從串S中刪除第pos個字符起長度為len的子串。ClearString
(&S)初始條件:串S存在。操作結(jié)果:將S清為空串。對于串的基本操作集可以有不同的定義方法,在使用高級程序設(shè)計語言中的串類型時,應(yīng)以該語言的參考手冊為準(zhǔn)。例如:C語言函數(shù)庫中提供下列串處理函數(shù):gets(str)
輸入一個串;puts(str)
輸出一個串;strcat(str1,
str2)
串聯(lián)接函數(shù);strcpy(str1,
str2,
k)
串復(fù)制函數(shù);strcmp(str1,
str2)
串比較函數(shù);strlen(str)
求串長函數(shù);在上述抽象數(shù)據(jù)類型定義的13種操作中,串賦值StrAssign、串復(fù)制Strcopy、串比較StrCompare、求串長StrLength、串聯(lián)接Concat以及求子串SubString等六種操作構(gòu)成串類型的最小操作子集。即:這些操作不可能利用其他串操作來實現(xiàn),反之,其他串操作(除串清除ClearString和串銷毀DestroyString外)可在這個最小操作子集上實現(xiàn)。實現(xiàn)方法:例如,定位函數(shù)Index(S,T,pos)如何實現(xiàn)
?可利用串比較、求串長和求子串操作實現(xiàn)。StrCompare(SubString(S,
i,
StrLength(T)),T
)iposS
串T
串n-m+1T
串int
Index
(String
S,
String
T,
int
pos)
{// T為非空串。若主串S中第pos個字符之后存在與T相等的子串,//
則返回第一個這樣的子串在S中的位置,否則返回0if
(pos>
0){
n
=StrLength(S); m
=StrLength(T); i=pos;while
(
i
<=
n-m+1){
SubString
(sub,
S,
i,
m);if
(StrCompare(sub,T)
!=
0) ++i
;//返回子串在主串中的位置else
return
i
;}//
while}//
ifreturn
0;}
//
Index//S中不存在與T相等的子串又如串的置換函數(shù)Replace(&S,T,V):T
串V
串V
串pospossubinews
串subS
串串的邏輯結(jié)構(gòu)和線性表極為相似,區(qū)別僅在于串的數(shù)據(jù)對象約束為字符集。串的基本操作和線性表有很大差別。在線性表的基本操作中,大多以“單個元素”作為操作對象;在串的基本操作中,通常以“串的整體”作為操作對象。在程序設(shè)計語言中,串只是作為輸入或輸出的常量出現(xiàn),則只需存儲此串的串值,即字符序列即可。但在多數(shù)非數(shù)值處理的程序中,串也以變量的形式出現(xiàn)。4.2
串的表示和實現(xiàn)串有三種機內(nèi)表示方法:一、串的定長順序存儲表示二、串的堆分配存儲表示
三、串的塊鏈存儲表示將串中的字符順序地存放在內(nèi)存一片連續(xù)的存儲單元中。設(shè)串S=‘a(chǎn)1
a2
...an’,則順序存貯結(jié)構(gòu)在內(nèi)存貯器中的存貯示意圖如圖所示:a1a2a3a
n一、串的定長順序存儲表示串的順序存貯結(jié)構(gòu)的兩種方式非緊縮存貯格式即一個字的存貯單元存放一個字符.緊縮存貯格式即一個字的存貯單元中放滿多個字符,然后在往下一個字存貯單元存放非緊縮存貯結(jié)構(gòu)programming存儲單元緊縮存貯結(jié)構(gòu)programming存儲單元與非緊縮存貯格式相比,緊縮存貯格式節(jié)省了存貯空間Status
Concat(SString
S1,
SString
S2,
SString
&T)
{//用T返回由S1和S2聯(lián)接而成的新串。若未截斷,則返回TRUE,否則FALSE。if
(S1[0]+S2[0]<=MAXSTRLEN){//未截斷T[1..S1[0]]=
S1[1..S1[0]];T[S1[0]+1..S1[0]+S2[0]]
=
S2[1..S2[0]];T[0]
=
S1[0]+S2[0]; uncut
=TRUE;
}}else
if
(S1[0]
<MAXSTRLEN)
{//截斷T[1..S1[0]]
=
S1[1..S1[0]];T[S1[0]+1..MAXSTRLEN]
=S2[1..MAXSTRLEN-S1[0]];T[0]
=
MAXSTRLEN;uncut
=FALSE;
}else
{//截斷(僅取S1)T[0..MAXSTRLEN]
=
S1[0..MAXSTRLEN];//
T[0]
==
S1[0]
==MAXSTRLENuncut
=
FALSE;return
uncut;}
//
Concat2.求子串SubString(&Sub,S,pos,len)求子串的過程即為復(fù)制字符序列的過程,將串S中從第pos個字符開始長度為len的字符序列復(fù)制到串Sub中。顯然,本操作不會有需截斷的情況,但有可能產(chǎn)生用戶給出的參數(shù)不符合操作的初始條件,當(dāng)參數(shù)非法時,返回ERROR。Status
SubString
(SString
&Sub,
SString
S,int
pos,int
len)
{//用Sub返回串S的第pos個字符起長度為len的子串.其中,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)return
ERROR;Sub[1..len]=S[pos..pos+len-1];Sub[0]=len;returnOK;}//
SubString綜上兩個操作可見,在順序存儲結(jié)構(gòu)中,實現(xiàn)串操作的原操作為“字符序列的復(fù)制”,操作的時間復(fù)雜度基于復(fù)制的字符序列的長度。另一操作特點是,如果在操作中出現(xiàn)串值序列的長度超過上界MAXSTRLEN時,約定用截尾法處理,這種情況下不僅在求聯(lián)接串時可能發(fā)生,在串的其它操作中,如插入、置換等也可能發(fā)生。克服這個弊病唯有不限定串長的最大長度,即動態(tài)分配串值的存儲空間。仍以一組地址連續(xù)的存儲單元存放串值字符序
列,但它們的存儲空間是在程序執(zhí)行過程中動態(tài)
分配而得。在C語言中,存在一個稱之為“堆”的自由存儲區(qū),并由C語言的動態(tài)分配函數(shù)malloc()和free()來管理。利用函數(shù)malloc()為每個新產(chǎn)生的串分配一塊實際串長所需的存儲空間,若分
配成功,則返回一個指向起始地址的指針,作為
串的基址。例:ch=(char*)malloc(len*sizeof(char))申請分配一個串長度為len
的存儲空間。二、串的堆分配存儲表示typedef
struct
{char
*ch;//若是非空串,則按串長分配存儲區(qū),//否則ch為NULL//串長度int
length;}
HString;串的堆分配存儲表示:這類串操作實現(xiàn)的算法為:先為新生成的串分配一個存儲空間,然后進行串值的復(fù)制。例如:串復(fù)制操作StrCopy(&T,S)的實現(xiàn)算法是,若T已存在,則先釋放串T所占空間,當(dāng)串S不空時,首先為串T分配大小和串S長度相等的存儲空間,然后將串S的值復(fù)制到串T中;又如串插入操作StrInsert(&S,pos,T)的實現(xiàn)算法是,為串S重新分配大小等于串S和串T長度之和的存儲空間,然后進行串值復(fù)制,如下述算法:Status
SubInsert
(HString
&S,
int
pos,Hstring
T)
{//1≤pos≤StrLength(S)+1。在串S的第pos個字符之前插入串Tif
(pos<1||pos>S.length+1)return
ERROR;if
(T.length){//pos不合法//T非空,則重新分配空間,插入Tif
(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))exit(OVERFLOW);for
(i=S.length-1;i>=pos-1;i--)//為插入T而騰出位置,數(shù)組下標(biāo)//從0---S.length-1。S.ch[i+T.length]=S.ch[i];
//后移T.length個位置
S.ch[pos-1..pos+T.length-2]=T.ch[0..T.length-1];
//插入TS.length+=T.length;}return
OK;}
//
SubInsert以上兩種存儲表示通常為高級程序設(shè)計語言所采用。由于堆分配存儲結(jié)構(gòu)的串既有順序存儲結(jié)構(gòu)的特點,處理方便,操作中對串長又沒有任何限制,更顯靈活,因此,在串處理的應(yīng)用程序中也常被選用。以下所示為只含最小操作子集的Hstring串類型的模塊說明:基本操作的函數(shù)原型說明:Satus
StrAssign(
Hstring
&T,char
*chars);//生成一個其值等于串常量chars的串Tint
StrLength(Hstring
S);//返回S的元素個數(shù),稱為串的長度int pare(Hstring
S,
Hstring
T);//若S>T,則返回值>0;//若S=T,則返回值=0;//若S<T,則返回值<0;Satus
ClearString(
Hstring
&S);//將S清為空串,并釋放S所占空間
Status
Concat
(Hstring
&T,Hstring
S1,Hstring
S2);//用T返回S1和S2聯(lián)接而成的新串
Hstring
SubString(Hstring
S,
int
pos,int
len);//1≤pos≤StrLength(S),且0≤len≤StrLength(S)-pos+1//返回串S的第pos個字符起長度為len的子串Status
Concat(HString
&T,
HString
S1,
HString
S2)
{//用T返回由S1和S2聯(lián)接而成的新串if
(T.ch)
free(T.ch);
//釋放舊空間if
(!(T.ch
=
(char
*)malloc((S1.length+S2.length)*sizeof(char))))exit(OVERFLOW);//分配失敗時退出T.ch[0..S1.length-1]
=
S1.ch[0..S1.length-1];T.ch[S1.length..T.length-1]
=
S2.ch[0..S2.length-1];T.length
=
S1.length
+
S2.length;return
OK;}
//ConcatStatus
SubString(HString
&Sub,
HString
S,int
pos,
int
len)
{//用Sub返回串S的第pos個字符起長度為len的子串if
(pos
<
1
||
pos
>
S.length
||
len
<
0
||
len
>
S.length-pos+1)return
ERROR;if
(Sub.ch)
free
(Sub.ch);//位置不合適//釋放sub的舊空間if
(!len)
//長度為0{Sub.ch=NULL; Sub.length=0;
}//空子串else
{
Sub.ch
=
(char
*)malloc(len*sizeof(char));Sub.ch[0..len-1]
=
S.ch
[pos-1..pos+len-2];//完整子串Sub.length
=
len;
}return
OK;}//SubString三、串的塊鏈存儲表示也可用鏈表來存儲串值,由于串結(jié)構(gòu)的特殊性——結(jié)構(gòu)中的每個數(shù)據(jù)域元素是一個字符,則用鏈表存儲串值時,存在一個“結(jié)點大小”的問題,即每個結(jié)點可以存放一個字符,也可以存放多個字符。當(dāng)結(jié)點大小大于1時。由于串長不一定是結(jié)點大小的整數(shù)倍,則鏈表中的最后一個結(jié)點不一定全被串值占滿,此時通常補上“#”或其它的非串值字符。結(jié)點大小為4的鏈表ABCDEFGHI###∧結(jié)點大小為1的鏈表ABCI∧//可由用戶定義的塊大小//結(jié)點結(jié)構(gòu)//串的鏈表結(jié)構(gòu)//串的頭和尾指針//串的當(dāng)前長度#define
CHUNKSIZE
80typedef struct
Chunk
{char
ch[CHUNKSIZE];struct
Chunk
*next;}
Chunk;typedef
struct
{Chunk
*head,
*tail;int
curlen;}
LString;為了便于進行串的操作,當(dāng)以鏈表存儲串值時,除頭指針外,還可附設(shè)一個尾指針指示鏈表中的最后一個結(jié)點,并給出當(dāng)前串的長度。稱如此定義的串存儲結(jié)構(gòu)為塊鏈結(jié)構(gòu),說明如下:ABCDEFGHI###∧ABCI∧S.headS.headS.tailS.tail存儲密度=數(shù)據(jù)元素所占存儲位實際分配的存儲位在鏈?zhǔn)酱鎯Ψ绞街校Y(jié)點大小的選擇直接影響著串處理的效率。這要求我們考慮串值的存儲密度。顯然,存儲密度?。ㄈ缃Y(jié)點大小為1時),運算處理方便,然而,存儲占用量大。實際應(yīng)用時,可以根據(jù)問題所需來設(shè)置結(jié)點的大小。串值的鏈?zhǔn)酱鎯Y(jié)構(gòu)對某些串操作,如拼接操作等有一定方便之處,但總的說來不如另外兩種存儲結(jié)構(gòu)靈活,它占用存儲量大且操作復(fù)雜。實際應(yīng)用很少。子串的定位操作通常稱作串的模式匹配,其中,子串被稱作模式串。串的模式匹配是串的一種重要操作,很多軟件,若有“編輯”菜單項的話,則其中必有“查找”子菜單項。4.3串的模式匹配算法初始條件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。操作結(jié)果:若主串S中存在和串T值相同的子串返回它在主串S中第pos個字符之后第一次出
現(xiàn)的位置;否則函數(shù)值為0。首先,回憶一下串匹配(查找)的定義:INDEX
(S,
T,
pos)int
Index
(String
S,
String
T,
int
pos)
{// T為非空串。若主串S中第pos個字符之后存在與T相等的子串,//
則返回第一個這樣的子串在S中的位置,否則返回0if
(pos>
0){n=StrLength(S); m=StrLength(T); i=pos;while
(
i
<=
n-m+1)
{SubString
(sub,
S,
i,
m);if
(StrCompare(sub,T)
!=
0)
++i
;else
return
i
;
//返回子串在主串中的位置}//
while}
//
ifreturn
0;}
//
Index下面討論以定長順序結(jié)構(gòu)表示串時的幾種INDEX
(S,
T,pos)算法。一、簡單算法二、首尾匹配算法三、KMP(D.E.Knuth,V.R.Pratt,
J.H.Morris)
算法一、簡單算法算法的基本思想:從主串S的第pos個字符起和模式T的第一個字符比較之,若相等,則繼續(xù)逐個比較后續(xù)字符,否則從主串的下一個字符起再重新和模式的字符比較之。依次類推,直至模式T中的每個字符依次和主串S中的一個連續(xù)的字符序列相等,則稱匹配成功,函數(shù)值為和模式T中第一個字符相等的字符在主串S中的序號,否則稱匹配不成功,函數(shù)值為零。int
Index(SString
S,
SString
T,
int
pos)
{}//Index算法時間復(fù)雜度為:O(m×n)
n為主串的長度,m為子串的長度,//返回子串T在主串S中第pos個字符之后的位置。若不存在,//則函數(shù)值為0。其中,T非空,1≤pos≤StrLength(S)。i=pos; j=1;while(i
<=S[0]
&&
j
<=T[0]){//S[0]存儲串的長度if
(S[i]
==
T[j])
{
++i;
++j;
}else
{
i
=
i-j+2;j
=
1;
}//繼續(xù)比較后繼字符//指針后退重新開始匹配}
//i指向比較完成后的下一個字符if
(j
>
T[0])
return
i-T[0];//說明j已經(jīng)比較完成else
return
0;第一趟匹配i=3ab
ab
cab
cacb
aba
b
c第三趟匹配ab
ab
cab
cacb
aba
b
c
a
ci
i=7j=1
j=5簡單算法的匹配過程示例(模式串T=‘a(chǎn)bcac’)第二趟匹配a
b
a
b
c
a
b
c
a
c
b
a
b(主串S)j=3i=2aj=1簡單算法的匹配過程示例(T=‘a(chǎn)bcac’)第四趟匹配ababcabcacbabi=4aj=1第五趟匹配第六趟匹配ababcabcacbabi=5ababcabcacbabaj=1i=6
i=11a
b
c
a
cj=6先比較模式串的第一個字符,再比較模式串的最后一個字符,最后比較模式串中從第二個到第n-1個字符。二、首尾匹配算法int
Index_FL(SString
S,SString
T,int
pos){//首尾匹配sLength=S[0]; tLength=
T[0]; i=pos;patStartChar
=
T[1]; patEndChar
=
T[tLength];while
(i
<=sLength
–tLength
+
1)
{if
(S[i]!=patStartChar)
++i;
//重新查找匹配起始點else
if
(S[i+tLength-1]
!=
patEndChar)
++i;//模式串的“尾字符”不匹配else
{k
=
1; j
=
2;//檢查中間字符的匹配情況while
(
j
<
tLength
&&
S[i+k]
==
T[j]){
++k;
++j;
}if
(
j
==
tLength
)
return
i;else
++i;
//重新開始下一次的匹配檢測}}return
0;}三、KMP(D.E.Knuth,
V.R.Pratt,J.H.Morris)
算法KMP算法的時間復(fù)雜度可以達到O(m+n)其改進在于:每當(dāng)一趟匹配過程中出現(xiàn)字符比較不等時,不需回溯i
指針,而是利用已經(jīng)得到的“部分匹配”的結(jié)果將模式向右“滑動”盡可能遠的一段距離后,繼續(xù)進行比較。第一趟匹配i=3ab
ab
cab
cacb
aba
b
c第二趟匹配ab
ab
cab
cacb
aba
b
c
a
cj=3i
i=7第三趟匹配ab
ab
cab
cacb
ab(a)bca
cj=1
j=5i
i=11j=2
j=6改進算法的匹配過程示例(T=‘a(chǎn)bcac’)當(dāng)S[i]<>T[j]
時,已經(jīng)得到的結(jié)果:S[i-j+1..i-1]
==
T[1..j-1]若已知則有T[1..k-1]
==
T[j-k+1..j-1]S[i-k+1..i-1]
==
T[1..k-1]即模式中頭k-1個字符的子串T[1..k-1]與主串中第
i個字符之前長度為k-1的子串S[i-k+1..i-1]相等,由此,匹配僅需從模式中第k個字符與主串中第i
個字符起繼續(xù)進行比較。定義:模式串的next函數(shù)若令next[j]=k,則next[j]表明當(dāng)模式中第j個字符與主串中相應(yīng)字符“失配”時,在模式中需要重新和主串中該字符進行比較的字符的位置。由此,
其它情況
Max{k |
1
k
j當(dāng)j
1時
0p
j-1
'}
pk
-1
'
'
p
j-k
1
且'p1p
2
1
next
[j]
……根據(jù)上述定義,計算下列模式串的next函數(shù)的值j
1
2
3
4
5
6
7
8模式串Next[j]
其它情況
Max{k |
1
k
j當(dāng)j
1時
0p
j-1
'}
pk
-1
'
'
p
j-k
1
且'p1p
2
1
next
[j]
……a
b
a
a
b
c
a
c0
1
1
2
2
3
1
2在求得模式的next函數(shù)之后,匹配可如下進行:假設(shè)以指針i和j分別指示主串S和模式P中正待比較的字符,令i
的初值為pos,j
的初值為1。若在匹配過程中,Si=pj,則i和j分別增1;否則,i不變,而j退到next[j]的位置再比較,若相等,則指針各自增1,否則j再退到下一個next值的位置,依次類推,直至下列兩種可能:一種是j退到某個next值時字符比較相等,則指針各自增1
繼續(xù)進行匹配;另一種是j
退到值為零(即模式的第一個字符“失配”),則此時需將模式繼續(xù)向右滑動一個位置,即從主串的下一個字符Si+1起和模式重新開始匹配。利用模式的next
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省鹽城市亭湖新區(qū)初級中學(xué) 蘇科版物理八年級上冊 八年級第一學(xué)期期末質(zhì)量檢測物理(含答案)
- 河北省張家口市橋西區(qū)2024-2025學(xué)年八年級上學(xué)期1月期末生物試卷(含答案)
- 5合同評審控制程序
- 地理-山東省2025年1月濟南市高三期末學(xué)習(xí)質(zhì)量檢測濟南期末試題和答案
- 2023年南京中醫(yī)藥大學(xué)中醫(yī)內(nèi)科學(xué)題庫
- 2024認定實際施工人法律風(fēng)險防范與合同完善服務(wù)合同3篇
- 2025年度工業(yè)互聯(lián)網(wǎng)安全電子交易SET合作協(xié)議3篇
- 2024高端設(shè)備制造銷售合同
- 2024年心理健康教育主題班會教案13篇
- 2024蔬菜大棚溫室租賃與智能控制系統(tǒng)供應(yīng)合同3篇
- 園林景觀給排水設(shè)計匯總計算書
- 《電線電纜常用計算公式》
- 美國簽證-個人信息表
- 關(guān)于心理健康教育情況的調(diào)研報告
- 內(nèi)側(cè)蒂直線短瘢痕法治療乳房肥大癥的臨床研究
- 天一大聯(lián)考2024屆物理高一上期末學(xué)業(yè)水平測試試題含解析
- 整改回復(fù)書樣板后邊附帶圖片
- 空氣能施工方案
- 常見藻類圖譜(史上最全版本)
- 硫酸裝置操作規(guī)程
- Python數(shù)據(jù)分析案例實戰(zhàn)PPT完整全套教學(xué)課件
評論
0/150
提交評論