昨天那个border算法我说好像在哪里见过,原来就是KMP算法中的精髓部分。KMP算法我以前是看过的,现在足以表明我看的是多么肤潜,或者说根本就没弄懂他的意思。以前对KMP算法的next[]函数引入是佩服的五体投地,四脚朝天,但对next[]函数并没有更深入的了解,想起昨天从字符串的边界问题引出了KMP算法,现在方知,KMP算法归根到底也是字符串的交迭和边界问题啊。岂非因祸得福!
关于KMP算法,网上有一篇绝妙的文章,个人认为是介绍的最通俗易懂的了。作者是A_B_C_ABC,原文地址:http://blog.csdn.net/A_B_C_ABC/archive/2005/11/25/536925.aspx 。看看里面串的模式值next[n]的定义:
(1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。
(2)next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符
相同,且j的前面的1—k个字符与开头的1—k
个字符不等(或者相等但T[k]==T[j])(1≤k<j)。
如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6]
(3)next[j]=k 意义:模式串T中下标为j的字符,如果j的前面k个
字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。
即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1]
且T[j] != T[k].(1≤k<j);
(4) next[j]=0 意义:除(1)(2)(3)的其他情况。
|
对比border(x)的定义:
计算长度为m的一个字符串x的边界的长度,设定一个包含m+1个整数的数组b,使得b[j]是字符串x[0,1...j-1]的边界的长度。特别的,border(x)的长度就是b[m],这里规定b[0]=-1。 |
border的复杂就体现在它把这么多话就压成这么二句话了,当然原文作者也根本就没提到KMP算法。至此大体解决了昨天的疑惑。
举个例子实战一下:给定字符串 x = abaababa,打印出数组b。
//border算法的一个应用
public class Border() {
public void Border(String x,char [] y) {
int m = x.length();
int [] b = new int[x.length()+1];
int i = 0;
b[0] = -1;
for(int j = 1;j <= m-1; j++) {
b[j] = i;
while( i >= 0 && y[j] != y[i]) {
i = b[i];
}
i++;
}
b[m] = i; //border算法
for(int k = 0;k < m+1; k++) {
System.out.println(b[k] + " ");
}
}
public static void main(String[] args) {
Border border = new Border();
char []X = {'a','b','a','a','b','a','b','a'};
String str = new String(X);
border.Border(str,X);
}
}
在C++中可以只用到String s = "abaababa",不知道这里可以一步到位吗?
分析结果,其实可以看出来 border(x)=3,因为有 abaababa abaababa。
当m = 0时 b[0] = -1
当m = 1时 依据border算法 b[1] = 0
....
最后结果应为:其中border(x) = b[m] = b[8] = 3。
运行结果和预测一致,如图:问题over!
分享到:
相关推荐
java代码-使用java解决xml--查找并替换字符串(避免乱码)的问题的源代码 ——学习参考资料:仅用于个人学习使用!
UART通信--发送1个字符串 ,是在单片机上操作的,代码可以顺利跑通
08.hive内置函数--时间-日期-字符串--函数.mp4
292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串...
一种方法是创建一个DrawNode对象,然后使用DrawNode的drawString()方法,配合GL顶点数组和颜色数组来逐个绘制字符串中的每个字符,这样可以为每个字符指定不同的颜色。这种方法需要对OpenGL ES有一定的理解,包括...
java-string-similarity, 各种字符串相似性和距离算法 java-string-similarity 实现不同字符串相似度和距离度量的库。 目前已经实现了许多算法( 包括Levenshtein编辑距离和 sibblings,jaro winkler,最长公共子序列...
Oracle Sql 中常用字符串处理函数 Oracle Sql 中提供了多种字符串处理函数,用于对字符串进行各种操作,如大小写转换、截取、连接、查找、替换等。下面是 Oracle Sql 中常用的字符串处理函数: 1. 大小写转换函数 ...
字符串比较问题 Description ?问题描述: 对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格 字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距 离...
字符串操作----- 字符串操作----- 字符串操作----- 字符串操作----- v 字符串操作----- 字符串操作----- 字符串操作-----
动态规划算法:从1到26分别对应a-z的每一个字母,输入一串数字的字符串,转换为字母,输出所有可能的字母序列。如123->abc、lc、aw 本资源是按照二叉树的思想解决该问题。从字符串的头部开始,每次可以取一个或者两...
Objective-C是一种用于开发iOS应用的主要编程语言,其字符串操作主要依赖于NSString类和NSMutableString类。NSString用于创建不可变字符串对象,而NSMutableString则用于创建可变字符串对象。以下是Objective-C中...
例如,是否可以将长字符串分解为多个字段,或者使用其他数据结构,如数组或集合类型,来存储和管理这些数据。 在实际应用中,应根据具体情况选择合适的方法。理解Oracle对不同类型字段的长度限制以及如何有效地处理...
POJ1016“Numbers That Count”通过简洁的字符串处理,让我们了解了如何利用状态转移和边界条件处理来解决实际问题。这个问题锻炼了我们对字符串的掌握,对字符的逐一判断,以及在动态过程中如何有效地更新和计算。...
oracle拼接字符串查询语句。 普通拼接字符串和拼接某一列的所有值。
c语言-practices-09-反转字符串.rar
PTA 7-29 删除字符串中的子串
在LabVIEW中,字符串操作是常见的任务之一,特别是在数据处理和信息传递中。要将单个字符串创建成字符串数组,我们需要了解LabVIEW的基本数据结构和编程方法。以下是一些关于如何在LabVIEW中创建字符串数组的关键...