关于字符串回文的Manacher算法

对于Manacher算法自己研究了一会,总算是理解了其中的含义,乘着有时间正好可以过来记录下:

思路:

  1. 将字符串变成奇数,通过加非字符串里面的符号表示,不过一般都是加的#
  2. 找出以当前索引为中点的最长回文数长度,并且记录,例如:#a#b#a,这个字符串所对应的长度便是[1,2,1,2,1,1],因为在#的时候组成不了回文,所以#这里是1,而到了a这里,因为#a#组成了回文,所以a的最长回文字符串长度是2,以此类推
  3. for循环开始比较,在这里一般来讲是首先需要定义一个字符串的边界变量,以防止数组越界,另外一个就是最长回文字符串的中点坐标,以此类推就可以

代码:

将填充符号计入到需要匹配的的字符串中

阅读更多

字符串匹配相关算法

今天无意间碰到了需要写子字符串匹配得算法,由于以前一直对字符串得KMP算法不太了解,所以今天趁着这个机会正好记录下这三种算法的差异:

  1. JavaApi实现
  2. 朴素字符串匹配算法
  3. KMP算法

Java的API实现子字符串查找:

在Java的String类里面有一个方法是indexof(str,index), 这个类的话是可以从一个字符串的指定位置查出是否包含子字符串,若不包含则返回的是-1,若包含的话则返回的是该子字符串在字符串中的索引位置。 那么这个算法是什么原理呢,这个算法的原理就是indexof会返回匹配到的字符串的索引,那么当这个算法匹配到了一个之后获取返回的索引,然后再加上字符串的长度,最后再在剩下的字符串里面匹配,便会得出所有的字符串个数。

1
2
3
4
5
6
7
8
9
10
11
public void test(){
String findText= "abcd";
String srcText ="mabcdfafasabcdfa";
int count = 0;
int index = 0;
while ((index = srcText.indexOf(findText, index)) != -1) {
index = index + findText.length();
count++;
}
System.out.println(count);
}
阅读更多