從左到右乙個個匹配,如果這個過程中有某個字元不匹配,就跳回去,將模式串向右移動一位。這有什麼難的?
匹配不成功,i回溯到開始,j 回溯到子串的開頭
匹配不成功,i 往後走
時間複雜度o(m*n)
利用已經部分匹配這個有效資訊,保持i指標不回溯,通過修改j指標,讓模式串盡量地移動到有效的位置
時間複雜度o(m+n)
字首,字尾,部分匹配值
字串部分匹配值
字首字尾
a0 (空集 空集)
空集空集
ab0 ab
aba1
ab a
ba a
abab
2 a ab aba
b ab bab
ababa
3 a ab aba abab
a ba aba baba
ababc
0 a,ab,aba,abab
c,bc,abc,babc
sssss
4s,ss,sss,ssss
s,ss,sss,ssss
abca
1 a,ab,abc
a,ca,bca
next 陣列 (子串回溯的位置)
不移動主串的情況
匹配失敗,子串回溯
右移的數字 = 已經匹配的字元數-對應的部分匹配值 j=next[j]+1
**
int kmp(char str,char temp)//這個是查詢
else
// system("pause");
return 0;
}void getnext(char str)//next陣列的建立,這個是關鍵
else }}
int kmp(char str,char temp)//這個是查詢
else
} if (j==length2)
return -1;
}
資料結構 考研 驗證回文串
說明 回文串是乙個正讀和反讀都一樣的字串,我們將空字串定義為有效的回文串。示例 輸入 level 輸出 true。最基本的回文串問題,可以用雙指標分別由前往後檢索和由後往前檢索,如果最後相遇則是回文串。可以利用乙個棧來通過壓入前半段,來判斷後半段 或者全部壓入,再與字串從後往前比較。也可以利用遞迴的...
考研資料結構
一 考研中的變數型別 1 基本型別 int float char 2 指標型別 3 結構體型 陣列,結構體 4 void型 考研中 定義無返回值函式。二 控制語句 1 判斷語句if 做決策 2 迴圈語句 做重複的事 for while 講講break與continue break結束整個迴圈 con...
資料結構 4之 串
串的邏輯結構與線性表極為相似,區別僅在於串的資料物件約束為字符集。線性表操作物件大多是單個元素,而在串中一般都是以整體 字串 來作為操作物件 串的操作 實現和線性表很多不同。串的基本操作型別不同的高階語言可以有不同的定義方法。串賦值,串複製,比較,求長度,連線,求子串,串清除,串銷毀 定長順序儲存表...