串(string)是由零个或多个宇符组成的有限序列,又名叫字符串。

定义的解释:

??串中的字符数目n称为串的长度,定义中谈到“有限”是指长度n是一个有限的数值。

??零个字符的串称为空串(null string),它的长度为零,可以直接用两双引号一表示,也可以用希腊Φ字母来表示。

??所谓的序列,说明串的相邻字符之间具有前驱和后继的关系。

下面是串的一些概念性东西:

??空格串,是只包含空格的串。注意它与空串的区别,空格串是有内容有长度的,而且可以不止一个空格。

??子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。

??串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。比较两个串是否相等,必须是它们串的长度以及它们各个对应位置的字符都相等时,才算是相等。

串与线性表的比较:

??两者的逻辑结构比较相似,不同的是串针对的是字符集(即串中的元素都是字符)。

??线性表更关注的是单个元素的操作,比如査找一个元素,插入或删除一个元素,但串中更多的是査找子串位置、得到指定位置子串、替换子串等操作。

??串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。一般是用定长数组来定义。

注意:

??串的连接操作,需要注意串长问题,可能遇到的问题就是两个串连接后会不会溢出,所以需要进行截断操作。

查找子串在主串中的位置,操作如下:

?1. 设i用于主串s1中当前位置下标值,j用于子串sub中当前位置下标值。

?2. 首先我们比较s1[1]与sub[1],如果相同的话,可能子串就开始了。

?3. 如果不相等,那么子串仍然是从sub[1]开始,而主串s1则以s1[2]与其比较。

?4. 如果连续出现子串长度次或以上匹配,那么就找到子串了,此时的j必然大于子串长度sub[0]。

KMP模式匹配算法:

??这个东西有些难懂,下面是我的学习的时候的一些经验,希望对大家有所帮助。

还有两篇KMP推荐:

从头到尾彻底理解KMP(2014年8月22日版) - 结构之法 算法之道 - 博客频道 - CSDN.NET

http://blog.csdn.net/v_july_v/article/details/7041827

下面是我的Java实现版本:

package com.phn.string;

import java.util.Arrays;

/**

*@author 潘海南

*@Email [email protected]

*@TODO 模式匹配算法

*@date 2015年7月26日

*/

public class FOKMP {

private static int[] getNext(String Str) {

int[] next = new int[Str.length()];

int i, j;

i = 0;

j = -1;

next[0] = -1;

while (i < Str.length() - 1) {

if (j == -1 || Str.charAt(i) == Str.charAt(j)) {

i++;

j++;

if (Str.charAt(i) != Str.charAt(j)) {

next[i] = j;

} else {

next[i] = next[j];

}

} else {

j = next[j];

}

}

return next;

}

public static int indexKMP(String S, String T) {

int i = 0;

int j = 0;

int[] next = getNext(T);

System.out.println(Arrays.toString(next));

while (i <= S.length() - 1 && j <= T.length() - 1) {

if (j == -1 || S.charAt(i) == T.charAt(j)) {

i++;

j++;

} else {

j = next[j];

}

}

if (j >= T.length())

return i - T.length();

return -1;

}

}

java中KMP模式,Java数据结构-串及其应用-KMP模式匹配算法相关推荐

  1. Java中的正则表达式 - Java Regex示例

    Java中的正则表达式 - Java Regex示例 欢迎使用Java中的正则表达式.它在Java中也称为Regex.当我开始编程时,java正则表达式对我来说是一场噩梦.本教程旨在帮助您掌握Java ...

  2. Java中的记录器 - Java日志示例

    Java中的记录器 - Java日志示例 今天我们将研究Java中的Logger.Java Logger提供了java编程的日志记录. 目录[ 隐藏 ] 1 Java中的记录器 1.1 Java Lo ...

  3. java中 数组声明,java数组声明格式

    java 声明动态数组,java对象数组详解,java中声明数组,java数组声明格式 Java 中数组的声明一维数组的声明: 在 Java 中,数组是独立的对象,有自身的方法,不是变量的集合. 数组 ...

  4. Java中apple导入那个包_在Java中,由Java编泽器自动导入而无需在程序中用import导入的包是()。A.java.appletB.java.awtC.j...

    在Java中,由Java编泽器自动导入而无需在程序中用import导入的包是().A.java.appletB.java.awtC.j 更多相关问题 问卷星是一个专业.无限制的免费在线问卷调查.测评. ...

  5. Java数据结构-串及其应用-KMP模式匹配算法

    1.前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而且这个算法的不少 ...

  6. java中的事件派发机制_事件派发器模式

    在项目开发中,会遇到如下情形:我们自己的服务订阅.接收来自消息队列或者客户端的事件和请求,基于不同的事件采取对应的行动,这种情况下适合应用派发器模式. 主要模块 XXXEventDispatcher类 ...

  7. java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)

    本篇文章给大家带来的内容是关于Java建造者模式是什么?如何实现?(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 建造者模式 一.什么是建筑者模式? 建造者模式(Build ...

  8. java中装饰器_Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  9. 10.JAVA中的集合(数据结构)

    Java中的集合 包含以下结构: 数组-线性表 链表 栈 队列 散列表 二叉树 映射关系(key-value) List集合  特点:[有序.重复] [线性表--数组] ArrayList 定义 线程 ...

最新文章

  1. GitHub 远程仓库 de 第一次配置
  2. DLL入门浅析(1)——如何建立DLL
  3. 2020知到python语言应用答案_2020年知到APPPython语言应用第四单元章节测试答案
  4. flutter --- Windows下环境配置
  5. java8的新特性_Java8的
  6. Mysql面试常见知识点总结(一)
  7. SVN update: 'skipped' message
  8. 如何使用Python玩转PDF各种骚操作?你看了就知道。
  9. Linux搜索文件或内容
  10. TX2--Tegra架构介绍
  11. 迷你四足机器人制作_从0到1
  12. 使用树莓派来做打印服务器
  13. 购物网站HTML(首页)
  14. 【不生气的智慧】王焕斌--书记
  15. 关于用户注册登录的问题
  16. Intelligent Designer
  17. 十年磨一剑,云原生分布式数据库PolarDB-X的核心技术演化
  18. 追踪(trace)系统框架设计的思考
  19. C#类似仪表盘数据显示的制作
  20. python 视频抽帧_FFmpeg视频抽帧那些事

热门文章

  1. vs2010变的特别卡解决办法
  2. RHEL5 安装VMware tools
  3. Linux 命令(43)—— paste 命令
  4. pojo类中的布尔类型的变量为什么不能加is
  5. 14 count(*)
  6. Spring MVC —— form表单post提交出现乱码
  7. iOS开发,更改状态栏(StatusBar)文字颜色为白色
  8. XidianOJ 1175: count
  9. SQL语句中常用关键词及其解释如下.pdf
  10. An internal error occurred during: Retrieving archetypes:. GC overhead limit exceeded