本文转自字符串匹配朴素算法
这个朴素算法的英文命名为BruteForce,暴力的意思,所谓的朴素算法就是算法分析上常讲的暴力求解方法。这是一种方法,也是一种算法思想,就是不考虑空间时间复杂度,以最简单的看待问题的视角去思考,去解决。比如八皇后问题,使用8重循环来依依判断,比如全排列,使用多重循环枚举的方式等等。
字符串匹配问题的朴素算法是字符串算法中最基本也可以算是最简单的算法了。他就是按照大多数人们的思维去思考这么一个匹配问题的,假设文本字符串为T[1,,,n],模板字符串P[1,,,m]。m <= n;一般说来,我们认为文本和模板的字母表相同。如果存在整数s 使
得0<= s <= n-m且T[s+1..s + m]=P[1..m],我们说模板P在文本T的偏移(shift) s出现,也可以说在位置s+1出现(因为T[s+1]=P[1])。字符串问题就是要找出所有合法的偏移。
下面是算法描述:
下面是C++实现代码:
由于书中是用序数代表的下标,我还是直接用下标来表示一切,与控制循环等。
- //字符串匹配算法,暴力求解
- #include <string>
- using std::string;
- int AlmostBruteForce(string Text, string Pattern)
- {
- int lenT = Text.length();
- int lenP = Pattern.length();
- int s,i;
- for (s = 0; s <= lenT-lenP; s++)
- {
- i = 0;
- bool bEqual = true;
- while (bEqual && (i < lenP))
- {
- if (Text[s+i] == Pattern[i])
- {
- i++;
- }
- else
- {
- bEqual = false;
- }
- }
- if (bEqual)
- {
- return s;
- }
- }
- return -1;
- }