字串匹配(部分整理)

2022-07-27 02:51:15 字數 2425 閱讀 3973

*載入本頁面時,公式可能未渲染(顯示亂碼)請重新整理該頁面重試

問題:給出兩串字元

\(text="adsgwadsxdsgwadsgz"\)長度為n

\(pattern="dsgwadsgz"\)長度為m

查詢pattern字串是否在text出現過並輸出所在位置。

時間複雜度\(o(mn)\)

很簡單粗暴,碰到稍微長一點的就。。。。。。

}時間複雜度\(o(mn)\),但是實際的速度要更快平均為\(o(m+n)\)

雜湊演算法就是將乙個字串中的任意子串映分別射到乙個實數上面(求子串的時間複雜度為\(o(1)\))

雜湊值的求法就是將字串的p進製數去模q(p常取131、13331,q常取264時雜湊值的重複概率要小,這裡不需要考慮數的溢位問題)將所有字首和求出後存放在陣列中(這裡的陣列假設記為hash)。求第l到r之間的字元字串的雜湊值不難推出為\(hash[r]−hash[l−1]∗p^\)(後面的要乘的p可以使用陣列存一下)

計算text字首的hash

void ha()

}

計算text從l到r之間的hash
ull get(int l,int r)
完整**
#include using namespace std;

typedef unsigned long long ull;

const int manx=1000010,base=131;

char text[maxn],prefix[maxn];

ull hash[maxn] ,p[maxn];

ull get(int l,int r)

void ha()

}int main()

*ps:這裡在計算雜湊時沒有單獨的去模乙個數,而是直接將hash陣列定義為』unsigned long long』。unsigned long long最大值為\(2^\)我們直接使用c++的特點——「如果超出最大表示範圍則會自動模乙個\(2^\)」,省去單獨去模乙個數。

時間複雜度\(o(n+m)\)

課本中常見演算法

構建prefix(字首)陣列

void prefix_table(char pattern,int prefix,int n)

} }

}

為了前後更加容易理解,這裡將陣列偶一以位。

void move_prefix_table(int prefix,int n)

prefix[0] = -1;

}

kmp查詢
void kmp_search(char text,char pattern)

return 0;

}void print(int *array, int n, char *arrayname)

printf("\n");

}void prebmbc(char *pattern, int m, int bmbc)

for(i = 0; i < m - 1; i++)

/* printf("bmbc: ");

for(i = 0; i < m; i++)

printf("\n"); */

}void suffix_old(char *pattern, int m, int suff)

}void suffix(char *pattern, int m, int suff)

}// print(suff, m, "suff");

}void prebmgs(char *pattern, int m, int bmgs)

// case2

j = 0;

for(i = m - 1; i >= 0; i--)}}

// case1

for(i = 0; i <= m - 2; i++)

// print(bmgs, m, "bmgs");

}void boyermoore(char *pattern, int m, char *text, int n)

else

}printf("no find.\n");

}

字串匹配

題目描述 讀入資料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...