字串的匹配

2021-07-26 16:45:20 字數 1319 閱讀 7777

可以保證主串不回溯,子串可以不用每次從頭開始。

第一是要計算出next陣列。

next陣列的計算方法:

next[j] = k;說明以前k-1個字元和後k-1個字元相等

那麼next[j+1]等於多少?若後第k個字元後前第k個字元相等的話,則next[j+1] = k+1 = next[j] + 1;;

若不相等的話,則子串的j退回到next[j]進行比較,直到相等。

舉例:

j123456

字元aacdea

next[j]

012111

根據教材資料結構next陣列的定義,將next[1]定義為0,則以後輸出next陣列的時候從1開始遍歷。

求解a a時候:

a a 的next陣列的元素分別是 0 1這個是固定的,也可以這樣理解: i = 1 ,j = 0 ,i指向要求值的a,j指向第乙個a。此時不應該比較 str[i]和str[j]的值,待賦值的字串從不參與

比較,應該是str[i-1]和str[j-1]進行比較.因為j == 0 所以i++,j++執行,next[2] = j = 1

求 aac:

此時, j == 1, i == 2,i指向第三個字元c,此時j 不等於 0,應該比較str[i-1]和str[j-1]的值,因為他們相等,則應該執行i++,j++,next[3] = j =2;

依次可計算出next陣列值

void getnext(char* str2, int* next)

else

} for(i=1; i < 10; i++)

}

假設主串中的字元用si表示,子串的字元分別用pj表示,如果si == pj,則i++,j++,否則i不變,j推回next[j]的位置比較。

如果相等,i,j的值加1,否則j繼續退回下乙個next[j]的位置。依次類推直到匹配成功或者j退回到了0,就是第乙個字元的next陣列值,表示第乙個字元也不匹配。

則i++,j++.

int getindex(char *str1, char *str2, int *next)

else

return 0;

}

next陣列優化:

如果乙個要被賦值next數字的字元和提供next數字的字元相等,則其應該為提供next的字元的對應的next數字。

void getnext(char* str2, int* next)

else

} for(i=1; i < 10; i++)

}

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...

字串匹配

time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...

字串匹配

面試題 給一串很長的字串,要求找到符合要求的字串,例如目的串 123 1 3 2 12 3 這些都要找出來 思路一 利用兩層迴圈,逐個查詢目的串中的字元,比如先查詢字元 1 是否在長字串中,再查詢 2 是否在長字串中,直到目的串遇到 0 是 include include include int m...