又见字符串算法,看到那个交迭和边界的算法,真是看到脑壳痛。由于原文资料还是英文的,上周就在那翻译了,还没仔细看过,也不知道翻译的对不对,今晚拿着打印版的跑到教室坐了会,假日人少但很清静!整个晚上光看交迭和边界问题了。文章算法给出来了,不至于看不懂吧,但实际上就是看不懂。经过一步步的画啊,终于有了些眉目。抓紧机会好好整理再回顾下:
①:什么叫两个字符串x和y的交迭?很简单,就是尽可能多的获取x的结尾部分和y的开头部分之间的交集。如:abacaba和acabaca 的交换长度就是5 因为有abacaba acabaca。 字符串x和字y的交迭表示为 overlap(x,y)。
②:什么叫字符串x的边界?字符串x的边界就是x和x的交迭。如:abaababa的边界就是3,因为有 abaababa abaababa 字符串x的边界记为border(x),显然有border(x)=overlap(x,x)。
正因为有②中overlap(x,x)=border(x)的关系,所以这两个问题其实可以归并到一个问题中来,这里都归到边界算法中来,为什么,按我弱弱的想法,后者少一个参数。嘿嘿。
扩展:当x是y的前缀,a是字母时,有overlap(xa,y)=border(xa)。例如:x=aba, y=x#=aba#,xa=abaa那么有overlap(xa,y)=overlap(abaa,aba#)=1,因为abaa aba#,同时border(xa)=overlap(xa,xa)=overlap(abaa,abaa)=1 因为abaa abaa。
我们假定z=overlap(x,y)。那么有公式一:
overlap(xa,y)=① za za是y的前缀
② border(za) 其他
|
又设u=border(z),对每个字母a,有公式二:
border(za)=① ua ua是x的前缀
②border(ua) 其他
|
公式一的②情况又可以用公式二来解决,于是交迭问题归并到边界问题中来解决。
现在用下面这一算法来解决边界问题:
计算长度为m的一个字符串x的边界的长度,设定一个包含m+1个整数的数组b,使得b[j]是字符串x[0,1...j-1]的边界的长度。特别的,border(x)的长度就是b[m],这里规定b[0]=-1。 |
Border算法的实现:
//Border算法
public class Border {
public void Border(String x) {
int m = x.length;
int b[0] = -1;
for(j = 1;j <= m-1;j++) {
b[j] = i;
while(i >= 0 && x[j]!=x[i]) {
i = b[i]; //先比较x[1]和x[0],若不相等继续x[2]比较x[0],直到x[i]=x[0],接下来就比x[i+1]和x[1],如此一直比下去..
}
i++;
}
b[m]=i;
System.out.println( b[m]);
}
}
上面就是算法的精华。我好像看到过一片文章大概意思差不多,但好懂些,不早了,睡觉了,明天找找。GoodNight!
分享到:
相关推荐
3. **循环与条件判断**:编写循环来遍历目标字符串,并根据算法逻辑进行条件判断,以找到匹配的模式。 4. **错误处理**:确保程序在遇到无效输入或内存分配失败等异常情况时能够正确处理。 5. **性能优化**:考虑...
在IT领域,字符串匹配是计算机科学中的一个基本问题,尤其在文本处理、数据搜索和模式识别等场景中广泛应用。带通配符的字符串匹配算法则是这个领域的延伸,它允许在模式字符串中包含特殊字符,如星号(*)或问号(?),...
《使用Delphi实现Levenshtein算法:计算字符串相似度》 在信息技术领域,字符串处理是常见的任务之一,其中计算两个字符串的相似度是尤为重要的一个环节。Levenshtein算法,也称为编辑距离算法,就是用于衡量两个...
在计算机科学领域,字符串相似度比较算法是一种用于评估两个字符串之间相似程度的技术。这些算法广泛应用于文本处理、信息检索、生物信息学等多个领域。当我们要判断两个字符串是否含有相同或相近的信息时,这类算法...
本题目的目标是实现一个字符串快速压缩算法,它将连续重复的字符进行压缩,遵循"字符重复次数+字符"的格式。例如,"xxxyyyyyyz"会被压缩成"3x6yz"。下面我们将详细讨论这个算法的实现及其涉及的关键知识点。 首先,...
本实验“基于字符串模式匹配算法的病毒感染检测问题”聚焦于如何利用这些算法来识别潜在的恶意代码,从而预防计算机病毒感染。 《数据结构(C语言版 第2版)》一书由著名计算机科学家严蔚敏编著,书中涵盖了各种...
本项目聚焦于“链式字符串运算算法”的C语言实现,这是一个关于数据结构和算法的重要话题,对于学习C语言和计算机科学的学生来说极具价值。 链式字符串运算算法的核心在于使用链表数据结构来存储和操作字符串。传统...
总结来说,"C++数据结构字符串及KMP匹配算法"是一个关于C++编程和字符串处理的主题,涵盖了自定义字符串类的设计和实现,以及在字符串匹配中应用KMP算法。通过理解和掌握这些知识,开发者可以更高效地处理字符串操作...
BM算法的核心思想是利用模式串中的信息来避免不必要的比较,通过跳过一些不可能匹配的字符,提高搜索效率。这主要依赖于坏字符规则和好后缀规则。 1. **坏字符规则**:当模式串的一个字符与文本串的当前字符不匹配...
在编程领域,字符串表达式解析求值算法是一种关键的技术,尤其在计算器应用、脚本语言或者自定义计算逻辑实现中非常常见。这个算法的核心任务是将由字符组成的字符串转换为可执行的数学表达式,同时处理变量和各种...
Levenshtein算法,也称为编辑距离算法,是由俄国数学家Vladimir Levenshtein在1965年提出的一种衡量两个字符串相似度的方法。这个算法基于动态规划原理,可以计算出将一个字符串转换成另一个字符串所需要的最少单...
字符串处理问题在面试中常出现,熟练掌握一些基本算法对于解决相关问题很有帮助。本篇文章将详细探讨字符串操作相关的知识点,重点讲述字符串循环左移、全排列问题及其解决方案。 首先,字符串循环左移问题是指将一...
算法与数据结构 算法分析课程 第11章 字符串匹配 字符串的匹配问题 KMP算法 共22页.pptx
《字符串模式匹配KMP算法》教学课例设计 在这篇教学设计中,我们旨在帮助学生掌握KMP字符串模式匹配算法的基本概念和应用。通过本课例设计,学生将了解KMP算法的应用普遍性、实现机制和时间复杂度,并掌握计算next...
很明显的这就是一个字符串匹配问题。所以我先用一个传统的字符串比较方法来实现,为了提高效率,考虑到字符串匹配较好的算法有Brute force(暴力搜索)其预处理时间为O(0),匹配时间复杂度O(N*M);KMP的预处理...
以上就是关于字符串算法的一些关键知识点,这些算法在数据挖掘、文本处理、生物信息学等多个领域都有广泛应用。通过理解和掌握这些算法,可以提升处理字符串问题的能力,并为解决实际问题提供有效工具。
`arithmetic.py`可能是包含这种LCS算法实现的文件,或者是与字符串操作或计算相关的其他算法。通过查看这个文件的源代码,可以更深入地理解博主的具体实现方法和可能的优化。 总结来说,LCS算法是一种计算字符串...
- **原理**:该算法通过比较主字符串与模式字符串的每个字符来寻找匹配的位置。 - **时间复杂度**:最坏情况下为O(n*m),其中n是主字符串长度,m是模式字符串长度。 - **适用场景**:当模式字符串较短时效果较好...