*載入本頁面時,公式可能未渲染(顯示亂碼)請重新整理該頁面重試
問題:給出兩串字元時間複雜度\(o(mn)\)\(text="adsgwadsxdsgwadsgz"\)長度為n
\(pattern="dsgwadsgz"\)長度為m
查詢pattern字串是否在text出現過並輸出所在位置。
很簡單粗暴,碰到稍微長一點的就。。。。。。
}時間複雜度\(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之間的hashull 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...