串的模式匹配演算法
子串的定位操作通常稱作串的模式匹配。通常用函式index( s, t, pos)來求解,其中s為主串,t為模式串,pos為主串中的位置,整個函式的作用是返回在字串s中的第pos個字元及以後(包含pos)首次出現與字串t相匹配的子串的第乙個字元的位置。例如:s=」abciu(5)abcjka(11)bcdiii」,t=」abcd」,則s中第5個字元後首次出現與t相同的子串的位置為11。
用計數指標i和j分別指示主串s和模式串t中當前正待比較的字元位置對應的下標(注意字串的第n個字元對應的下標為n-1,故i的初始值為pos-1,j 的初始值為0,因此j 的值即為匹配的字元的個數)。演算法的基本思想是:
(1)從主串的s的第i個位置代表的字元起和模式t的第乙個字元(對應j = 0)比較,如果相等:
1)則i++,j++繼續逐個比較後續字元;
2)當有n個(n大於1且小於模式t的長度)字元匹配,第n+1個字元不匹配時,用主串中這n個匹配的連續字元的第二個字元作為當前的新i值(當前的新i值與之前的舊i值的關係為inew= iold –n +1,其中iold–n 即為連續匹配的n個字元的第乙個字元,再加1即為匹配的第二個字元,而n = j 故inew= iold –j +1)與模式t的第乙個字元比較,將n值也置為0,回到(1)繼續比較。s=」abciu(4)ab(6)cjka(10)bcdiii」,t=」abcd」,例如對於該字串,從第六個字元開始的三個字元匹配之後,此時i = 8,j = 3,對應的主串字元為『j』與模式t的第四個字元d不匹配;因此inew= iold –n +1 = 8 - 3 + 1 =6,j = 0繼續回到(1)比較。(2)從主串的s的第i(第一次比較時i值即為pos的值)個字元起和模式t的第乙個字元比較之後不相等,則從主串的下乙個字元(i++)起再重新和模式t的第乙個字元( j = 1 )比較。
(3)依次類推,直到連續匹配的字元個數n等於模式t的字元個數時,匹配成功,返回這n個連續字元的第乙個字元的位置(當前i值減去字元長度n即為首字元的位置)。否則,當s到達字串末尾時n值不等於模式t的字元個數時,匹配失敗。
typedef structhstring;
//若str1指向的主串中存在和str2指向的字串相同的字串,則返回她在主串s中第pos個字元之後第一次出現的位置
int index( hstring *str1, hstring *str2, int pos )
; //用於儲存出現和str2指向的串相同的子串的開始位置
if( str1->length == 0 || str2->length == 0 )
else
i++;
j++;
}else
else //下次應該從該字元的下乙個位置開始比較,因此加1
j = 0;//j不等於0說明str2的前j-1個字元與str1的中第i個位置之前的j-1個子符匹配,則繼續用str1的第i個字元與str2的第乙個字元比較
//比如str1為cdefabcabcd,str2為abcd,第四個字元到第7個字元相等,第八個字元不等,此時i為8,j為4,則下次應用str1的第五個字元b與str2的第乙個字元比較
}} k = 0;
while( position[ k ] > 0 )
return 0; //在str1的pos之後不存在與str2相同的子串
}}
串的模式匹配演算法
子串的定位操作通常稱做串的模式匹配,這也是串的乙個很要的操作。一,一般定位子串位置演算法 演算法基本思想 從主串的第1個字元起和模式的第乙個字元進行比較,若相等,則再比較主串和模式串的後續字元。否則將主串的後續字元和模式串的第乙個字元進行比較,在網上找的一張 return i t.length 找到...
串的模式匹配演算法
1 求子串位置的定位函式 子串的定位操作通常稱做串的模式匹配,是各種串處理系統中最重要的操作之一。現採用定長順序儲存結構,可以寫出簡單匹配演算法。int index sstring s,sstring t,int pos else if j t 0 return i t 0 else return ...
串的模式匹配演算法
1 brute force模式匹配演算法 暴力匹配 如果用暴力匹配的思路,並假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則有 如果當前字元匹配成功 即s i p j 則i j 繼續匹配下乙個字元 如果失配 即s i p j 令i i j 1 j 0。相當於每次匹配失敗時,i 回溯,j...