子串定位運算
串是特殊的線性表
C語言的串庫<string
下面討論在順序串和鏈串上實現的子串定位運算
子串定位運算類似於串的基本運算中的字符定位運算
【例】在文本編輯中
子串定位運算又稱串的模式匹配或串匹配
在串匹配中
假設T 為目標串
T=
P=
串匹配就是對於合法的位置(又稱合法的位移)
①若
②若
因此
注意
有些應用中要求求出P在T中所有出現的有效位移
(
即用一個循環來依次檢查n
具體過程【參見動畫演示】
(
以下以第二種定長的順序串類型作為存儲結構
#define MaxStrSize
typedef struct{
char ch[MaxStrSize]; //可容納
int length;
}SeqString;
int Naive StrMatch(SeqString T
{//找模式P在目標T中首次出現的位置
int i
int m=P
int n=T
for(i=
j=
while(j<m&&T
k++;j++;
}
if(j==m) //既T[i
return i; //i為有效位移
}//endfor
return
}//NaiveStrMatch
(
①最壞時間復雜度
該算法最壞情況下的時間復雜度為O((n
分析
②模式匹配算法的改進
樸素的串匹配算法雖然簡單
若利用部分匹配結果
用結點大小為
LinkStrNode *LinkStrMatch(LinkString T
{//在鏈串上求模式P在目標T首次出現的位置
LinkStrNode * shift
shift=T; //shift表示位移
t=shift;p=P;
while(t&&p) {
if(t
t=t
p=p
}
else{ //已確定shift為無效位移
shift=shift
t=shift;
p=P;
}
}//endwhile
if(p==NULL)
return shift; //匹配成功
else
return NULL; //匹配失敗
}
該算法的時間復雜度與順序表上樸素的串匹配算法相同
From:http://tw.wingwit.com/Article/program/sjjg/201311/22622.html