用sunday演算法解決字串匹配問題

2021-08-01 02:59:22 字數 2061 閱讀 1156

題目內容:

題目說起來很簡單,你會讀到兩個字串,每個字串佔據一行,每個字串的長度均小於10000字元,而且第乙個字串的長度小於第二個字串的。你的程式要找出第乙個字串在第二個字串中出現的位置,輸出這些位置,如果找不到,則輸出-1。

注意,第乙個字元的位置是0。

注意,第乙個字串在第二個字串中的位置可能不止一處。

注意,字串中可能含有空格。

注意,兩個字串的長度一定大於0。

輸入格式:

兩個字串,一行乙個。

輸出格式:

第乙個字串在第二個字串中出現的位置,按照從小到到的順序排列,每個數字後面有乙個空格。

如果在第二個字串中找不到第乙個字串,則輸出-1。

輸入樣例:

abba

ababbba abbabbabbabbaacc

輸出樣例:

8 11 14 17

/sunday演算法解決字串匹配問題///

sunday演算法思想:

對匹配串長度的模式串進行隨機順序的檢測,在失敗位置生成

移動陣列,根據移動資料最大幅度的減少匹配次數

使用結構體:

sqstring(char data;int lengthp) //順序棧儲存字串

函式說明:

sundayindex:

輸入: 

int start //模式開始匹配位置

sqstring s //模式串

sqstring p //匹配串 

int scanordtouse 

//對讀取順序進行的順序讀取轉譯

int scanorder 

//隨機生成的匹配串讀取順序

int valueofshift //對錯誤位置生成的後移陣列

輸出:返回匹配成功的字串起始位置,失敗返回-1

演算法思路:

int i=start,j=0; 

//i代替起始位置,j代表匹配串當前匹配位置

while 開始位置未到模式串尾,匹配串未結束

//按檢查順序檢查,匹配成功繼續下乙個

//失敗將模式串定位i移動對應位置

返回成功與否資訊  

/ #include

#include

#include

#define maxsize 10000

typedef struct

sqstring;

//獲取隨機排序

void getscanorder (int len,int scanorder, int scanordtouse) }

}for (i=0; i

scanordtouse[scanorder[i]] = i;}

//成功匹配位置檢查

int checksucc (int i, sqstring p, int scanordtouse, int k)  

else

i--;  }

if (i==-1) //如果成功匹配全部檢查成功,返回成功資訊

return 1;  }

//獲取valueofshift陣列

void getvalueofshift (sqstring p,int valueofshift,int scanorder,int scanordtouse)

else

if (!checksucc(j-1,p,scanordtouse,k)) k++;

else break;  }

valueofshift[scanordtouse[j]] = k; 

j++;

}   }

int sundayindex (int start,sqstring s,sqstring p,int scanordtouse,int scanorder,int valueofshift)

} if (j>=p.length)

return i;

else

return -1; }

int main ()

} if (existif == 0)

printf ("%d",-1);  }

sunday演算法研究 超越kmp的字串匹配

第一次聽到sunday演算法,是大餅餅說的。在他 並茂的解釋中,我發現這個演算法果然是乙個又容易理解,效率又強過kmp和bm的演算法。於是試著寫了乙個,果真是好東東,分享一下。轉一些概念先 sunday演算法是daniel m.sunday於1990年提出的一種比bm演算法搜尋速度更快的演算法。其核...

字串匹配 sunday演算法

原題 lintcode題目 字串查詢 又稱查詢子字串 是字串操作中乙個很有用的函式。你的任務是實現這個函式。對於乙個給定的 source 字串和乙個 target 字串,你應該在 source 字串中找出 target 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。字串匹配最常見的就是km...

字串匹配sunday演算法

在網上看到了一種比kmp和bm演算法還快字串匹配演算法,就看了一下,並且發現一些部落格上寫的 是錯誤的,於是我也寫了乙個,leetcode上測試通過。首先對sunday演算法進行一下講解 從別的地方複製過來的,講的確實不錯 好了,sunday演算法還真的很好理解,用下面的例子來說明吧 j k t h...