`
viMory
  • 浏览: 58510 次
  • 性别: Icon_minigender_1
  • 来自: 土卫六
最近访客 更多访客>>
社区版块
存档分类
最新评论

"因祸得福" ---字符串交迭和边界问题的继续回顾

阅读更多

        昨天那个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]的定义:

1next[0]= -1  意义:任何串的第一个字符的模式值规定为-1

2next[j]= -1  意义:模式串T中下标为j的字符,如果与首字符

     相同,且j的前面的1—k个字符与开头的1—k

    个字符不等(或者相等但T[k]==T[j])(1k<j)。

     如:T=”abCabCad” next[6]=-1,因T[3]=T[6]

3next[j]=k    意义:模式串T中下标为j的字符,如果j的前面k

     字符与开头的k个字符相等,且T[j] != T[k] 1k<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].1k<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。

 

-1 0 0 1 1 2 3 2 3

 

运行结果和预测一致,如图:问题over!

 

 

 

4
0
分享到:
评论
1 楼 viMory 2008-05-04  
还是搞错了,两个算法有点相似,但还是有着本质的不同,边界问题只关系到一个字符串,KMP算法关系到二个,这怎么可能相同呢?唉,太弱智了...
现在也不得不佩服border算法的精妙

相关推荐

    java代码-使用java解决xml--查找并替换字符串(避免乱码)的问题的源代码

    java代码-使用java解决xml--查找并替换字符串(避免乱码)的问题的源代码 ——学习参考资料:仅用于个人学习使用!

    UART通信--发送1个字符串

    UART通信--发送1个字符串 ,是在单片机上操作的,代码可以顺利跑通

    PTA 6-13 函数实现字符串逆序

    在编程领域,字符串逆序是一种常见的操作,尤其在数据结构和算法的学习中。PTA(Programming Training Arena)是一个在线编程训练平台,它提供了各种练习题目来帮助学生提升编程技能。题目"PTA 6-13 函数实现字符串...

    292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)

    292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串...

    Oracle_Sql_中常用字符串处理函数

    Oracle Sql 中常用字符串处理函数 Oracle Sql 中提供了多种字符串处理函数,用于对字符串进行各种操作,如大小写转换、截取、连接、查找、替换等。下面是 Oracle Sql 中常用的字符串处理函数: 1. 大小写转换函数 ...

    字符串操作-----

    字符串操作----- 字符串操作----- 字符串操作----- 字符串操作----- v 字符串操作----- 字符串操作----- 字符串操作-----

    Java 所有字符串转UTF-8 万能工具类-GetEncode.java

    不需要关心接受的字符串编码是UTF_8还是GBK,还是ios-8859-1,自动转换为utf-8编码格式,无需判断字符串原有编码,用法://处理编码String newStr = GetEncode.transcode(oldStr);

    动态规划算法--1-26对应a-z字符串转换

    动态规划算法:从1到26分别对应a-z的每一个字母,输入一串数字的字符串,转换为字母,输出所有可能的字母序列。如123-&gt;abc、lc、aw 本资源是按照二叉树的思想解决该问题。从字符串的头部开始,每次可以取一个或者两...

    Objective-C中字符串操作总结

    Objective-C是一种用于开发iOS应用的主要编程语言,其字符串操作主要依赖于NSString类和NSMutableString类。NSString用于创建不可变字符串对象,而NSMutableString则用于创建可变字符串对象。以下是Objective-C中...

    pure-bash-bible-zh_CN-字符串循环左移

    字符串循环左移 字符串循环左移 字符串循环左移 字符串循环左移 字符串循环左移

    CLOB 字段类型报错 ORA-01704: 文字字符串过长的解决

    例如,是否可以将长字符串分解为多个字段,或者使用其他数据结构,如数组或集合类型,来存储和管理这些数据。 在实际应用中,应根据具体情况选择合适的方法。理解Oracle对不同类型字段的长度限制以及如何有效地处理...

    字符串处理必做题解析

    5. **字符串统计问题**:解决实际问题中的字符串统计需求。 #### 二、详细解析 ##### 1. 字符串的基本定义与表示 - **定义**:字符串是由零个或多个字符组成的序列,通常用于表示文本信息。 - **表示**:在C语言...

    Labview 字符串和UTF8的相互转换

    在做Labview和tcp通讯的时候,需要发送中文字符串,找了会相关资料,竟然找到了labview提供的现成的字符串到utf8相互转换的vi,整理了一下分享出来,2014环境下目前测试可以直接使用。原文...

    jmu-python-字符串异常处理.txt

    jmu-python-字符串异常处理.txt

    TIA博途-截取有效字符串FB全局库文件-V17版本-GF-String-Slice.zip

    5. **边界检测**:确保截取的字符串在有效范围内,防止返回无效或无意义的子串。 使用这样的FB全局库文件有诸多好处: - **代码重用**:一旦创建,这个FB可以在项目中的多个地方重复使用,减少重复编写代码的工作...

    用c++比较两个字符串的大小

    本篇文章将基于提供的代码示例,详细解释如何通过指针和`for`循环来比较两个字符串的大小。 #### 代码解读 首先,让我们详细了解这段代码是如何实现字符串比较功能的: ```cpp #include using namespace std; ...

    c语言删除字符串中指定的所有字符

    此代码示例提供了一种高效的方法来移除字符串中的特定字符,并且已经在Windows和Linux环境下进行了测试验证。 ### 一、理解需求 首先,我们要明确本程序的功能:删除一个字符串中所有出现的指定字符。例如,给定...

Global site tag (gtag.js) - Google Analytics