題目內容:
題目說起來很簡單,你會讀到兩個字串,每個字串佔據一行,每個字串的長度均小於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...