串是由零個或多個字元組成的有限序列,又名字串。
1.1 串大小的比較
給定兩個串
s=」a0
a1…a
n 」
t=」b0
b1…b
m 」
當滿足以下條件之一,sai
=bi
ai=b
i (i=0,1…k-1) 且 ak
主串s=」goodgoogle」 , 子串t=」google」
2.1 樸素的匹配匹配演算法
子串匹配主串,由子串的第乙個字元與主串的第乙個字元開始比較,若相同,比較下乙個。
如果完全相同,匹配成功。
如果有乙個不同,用子串的第乙個字元與主串的第二個字元比較。如此迴圈。時間複雜度為o(m*n)
public
static
intmatch(string s, string t)
int i=0,j=0;
while(iif(s.charat(i) == t.charat(j)) else
}if(j == t.length())
return -1;
}2.2 kmp演算法
樸素匹配演算法會一直回溯主串,導致很多不必要的比較。kmp演算法就是保證主串不回溯,從而提高效率。
預處理時間複雜度為o(m),匹配時間複雜度為o(n)
2.2.1 kmp演算法的簡單理解
主串s=」bbc abcdab abcdabcdabde」
子串t=」abcdabd」
2.2.2 子串的預處理
首先需要知道字首和字尾的概念
字首:除了最後乙個字元以外,乙個字串的全部頭部組合;
字尾:除了第乙個字元以外,乙個字串的全部尾部組合。
預處理就是獲取字首和字尾的最長的共有元素的長度
子串處理的步驟
「a」的字首和字尾都為空集,共有元素的長度為0;如果將上述的元素組成陣列 [0, 0, 0, 0, 1, 2, 0],成為next陣列「ab」的字首為[a],字尾為[b],共有元素的長度為0;
「abcd」的字首為[a, ab, abc],字尾為[bcd, cd, d],共有元素的長度為0;
「abcda」的字首為[a, ab, abc, abcd],字尾為[bcda, cda, da, a],共有元素為」a」,長度為1;
「abcdabd」的字首為[a, ab, abc, abcd, abcda, abcdab],字尾為[bcdabd, cdabd, dabd, abd, bd, d],共有元素的長度為0。
max即是共有元素的最大長度
2.2.3 匹配步驟
a、開始匹配
子串的第乙個與主串比較,如果不同則使用主串的後乙個與子串比較
b、匹配到部分相同
如圖,主串的第4個元素與子串匹配相同,直到第11個不同。現在相同的部分為abcdab。通過上面對子串的預處理可以知道,子串有公共的元素為ab,長度為2
現在已知的條件:
主串與子串相同的部分為abcdab子串有相同的部分ab
所以再次比較時 子串的ab不再與主串的abcdab比較 直接使用子串第乙個ab後的字元c與主串第二個ab後的字元 空字元 比較。因為ab是已知相同的。這就是kmp演算法的核心原理了
c、失配時再次比較
上一次子串的字元c和主串的空字元不匹配,則使用子串的第乙個字元進行比較。如此迴圈,知道完成
步驟b 匹配到部分相同,子串c與主串空字元比較時,跳過的步驟為匹配元素的長度6 - 相同部分ab的長度2 = 4
2.2.4 next 陣列的優化public class main else
}return
next;
}public static int indexof(string src, string ptn) else
}if (j == plen)
return i - j;
return -1;
}public static void main(string args)
}
參考:public
static
int getnext(string sub) else
}return next;
}
next陣列的解釋:
長篇大論:
**:
資料結構 串
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。我們求整個字串的排列,可以看成兩步 首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。第...
資料結構 串
串名 串值 串長 空串 空格串。字串的比較 字串模式匹配演算法 1.簡單字串模式匹配演算法 最簡單實現是用字串p的字元依次與字串t中的字元進行比較。實現思想是,首先將子串p從第0個字元起與主串t的第pos個字元起依次比較對應字元,如全部對應相等,則表明已找到匹配,成功終止。否則將子串p從第0個子串起...
資料結構 串
串 又稱字串 是一種特殊的線性表,它的每個結點僅由乙個字元組成。在早期的程式語言中,串僅在輸入或輸出中以直接量的形式出現,並不參與運算。隨著計算機的發展,串在文字編輯 詞法掃瞄 符號處理以及定理證明等許多領域得到越來越廣泛的應用。在高階語言中開始引入了串變數的概念,如同整型 實型變數一樣,串變數也可...