演算法 08| 字串演算法
1. 字串概念
•Python:
x = ‘abbc’ x = “abbc”
• Java:
String x = “abbc”;
Python和Java中的string都是不可變資料型別, immutable:https://lemire.me/blog/2017/07/07/are-your-stringsimmutable/
當加一個或減一個字元它就新生成一個String,原來的String還是原來的內容。immutable它也是有好處,它是執行緒安全的,可變有可能在多執行緒環境裡面有一些問題。
• C++:
string x(“abbc”),mutable,是可變的型別
2. 字串的遍歷
• Python:
for ch in “abbc”: print(ch)
• Java:
String x = “abbc”;
for (int i = 0; i < x.size(); ++i) { char ch = x.charAt(i); } for ch in x.toCharArray() { System.out.println(ch); }
• C++:
stringx(“abbc”); for (int i = 0; i < s1.length(); i++) { cout << x[i]; }
3. 字串比較
Java: String x = “abb”; String y = “abb”; x == y —-> false, java中它是比較它們的指標,比較它們的reference的地址,而不是比較字串裡邊的內容,變數x,y是兩個不同的變數,它指向記憶體中的不同地址, x.equals(y) —-> true //比較變數x和y的內容;x.equalsIgnoreCase(y) —-> true //忽略大小寫的進行比較。
4. 字串匹配演算法
4.1 BF(Brute Force)演算法
BF演算法(Brute Force)中文叫作暴力匹配演算法,也叫樸素匹配演算法 ---時間複雜度 O(mn)。
主串和模式串,在字串 A 中查詢字串 B,那字串 A 就是主串,字串 B 就是模式串。把主串的長度記作 n,模式串的長度記作 m。在主串中查詢模式串,所以 n>m。
作為最簡單、最暴力的字串匹配演算法,BF 演算法的思想可以用一句話來概括,那就是,在主串中,檢查起始位置分別是 0、1、2…n-m 且長度為 m 的 n-m+1 個子串,看有沒有跟模式串匹配的。
每次都比對 m 個字元,要比對 n-m+1 次,這種演算法的最壞情況時間複雜度是 O(n*m)。但在實際的開發中,它卻是一個比較常用的字串匹配演算法,因為:
第一,實際的軟體開發中,大部分情況下,模式串和主串的長度都不會太長。而且每次模式串與 主串中的子串匹配的時候,當中途遇到不能匹配的字元的時候,就可以就停止了,不需要把 m 個字元都比對一下。所以,儘管理論上的最壞情況時間複雜度是 O(n*m),但是,統計意義上, 大部分情況下,演算法執行效率要比這個高很多。
第二,樸素字串匹配演算法思想簡單,程式碼實現也非常簡單。簡單意味著不容易出錯,如果有 bug 也容易暴露和修復。在工程中,在滿足效能要求的前提下,簡單是首選。這也是我們常說的KISS(Keep it Simple and Stupid)設計原則。
所以,在實際的軟體開發中,絕大部分情況下,樸素的字串匹配演算法就夠用了
2.Rabin-Karp 演算法
3.KMP 演算法
Boyer-Moore 演算法:https://www.ruanyifeng.com/blog/ 2013/05/boyer-moore_string_search_algorithm.html
Sunday 演算法:https://blog.csdn.net/u012505432/article/ details/52210975