資料結構 串

2021-08-04 10:40:37 字數 2726 閱讀 1114

串是由零個或多個字元組成的有限序列,又名字串。

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;

「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。

如果將上述的元素組成陣列 [0, 0, 0, 0, 1, 2, 0],成為next陣列

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

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)

}

2.2.4 next 陣列的優化

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個子串起...

資料結構 串

串 又稱字串 是一種特殊的線性表,它的每個結點僅由乙個字元組成。在早期的程式語言中,串僅在輸入或輸出中以直接量的形式出現,並不參與運算。隨著計算機的發展,串在文字編輯 詞法掃瞄 符號處理以及定理證明等許多領域得到越來越廣泛的應用。在高階語言中開始引入了串變數的概念,如同整型 實型變數一樣,串變數也可...