热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据结构字符串操作的Java实现,包括BruteForce和KMP模式匹配算法

本篇博文用java实现了数据结构中的字符串操作,包括Brute-Force和KMP模式匹配算法源码分享在github:数据结构,当然你也可以从下面的代码

本篇博文用java实现了数据结构中的字符串操作,包括Brute-Force和KMP模式匹配算法
源码分享在github:数据结构,当然你也可以从下面的代码片中获取

1.字符串的接口定义 IString .java

package code.string;
/*
* 串的接口定义
*
* */

public interface IString {public void clear();//置空操作public boolean isEmpty();//判空操作public int length();//求字符串长度public char charAt(int index);//读取并返回串中第index个字符的值&#xff0c;范围 0 <&#61; index public IString substring(int begin,int end);//截取字符串&#xff0c;返回当前串从 begin 到 end-1的值public IString insert(int offset,IString str);//插入字符串你&#xff0c;在第offset之前插入串strpublic IString delete(int begin,int end);//删除&#xff0c;从begin 到 end-1public IString concat(IString str);//连接操作&#xff0c;把str串连接到当前串的后面public int compareTo(IString str);//将当前串与目标串进行比较&#xff0c;若当前串大于str&#xff0c;则返回一个整数&#xff0c;等于返回0,小于&#xff0c;返回-1public int indexOf(IString str,int begin);//子串定位操作&#xff0c;搜索与str相等的子串&#xff0c;成功则返回str在当前位置
}

2.字符串的顺序存储实现 SeqString .java

package code.string;
/*
* 串的顺序存储结构
* */

public class SeqString implements IString{private char [] strValue;//字符数组&#xff0c;存放串值private int curLen;//串中字符个数&#xff0c;即串的长度//构造方法public SeqString(){strValue &#61; new char[0];curLen &#61; 0;}//以一段字符串构造public SeqString(String str){char [] tempCharArray &#61; str.toCharArray();strValue &#61; tempCharArray;curLen &#61; tempCharArray.length;}//以字符数组构造串对象public SeqString(char [] value){this.strValue &#61; new char[value.length];for (int i &#61; 0;i<value.length;i&#43;&#43;){this.strValue[i] &#61; value[i];}curLen &#61; value.length;}//扩充字符串存储空间&#xff0c;参数指定容量,后面的插入字符串需要调用public void allocate(int newCapacity){char [] temp &#61; strValue;strValue &#61; new char[newCapacity];//复制数组for (int i &#61; 0;i<temp.length;i&#43;&#43;){strValue[i] &#61; temp[i];}}&#64;Overridepublic void clear() {this.curLen &#61; 0;}&#64;Overridepublic boolean isEmpty() {return curLen &#61;&#61; 0;}&#64;Overridepublic int length() {return curLen;}//返回字符串中序号为index的字符&#64;Overridepublic char charAt(int index) {if ((index < 0)|| (index >&#61; curLen)){throw new StringIndexOutOfBoundsException(index);}return strValue[index];}//截取字符串&#xff0c;返回当前串从 begin 到 end-1的值&#64;Overridepublic IString substring(int begin, int end) {if (begin < 0){throw new StringIndexOutOfBoundsException("起始位置不能小于0");}if (end > curLen){throw new StringIndexOutOfBoundsException("结束位置不能大于串的当前长度:"&#43;curLen);}if (begin >&#61; end){throw new StringIndexOutOfBoundsException("开始位置不能大于等于结束位置");}//截取全部字符串if (begin &#61;&#61; 0 && end &#61;&#61; curLen){return this;} else {char [] buff &#61; new char[end - begin];for (int i &#61; 0;i<buff.length;i&#43;&#43;){buff[i] &#61; this.strValue[i&#43;begin];}return new SeqString(buff);}}//插入字符串你&#xff0c;在第offset之前插入串str&#xff0c;offset有效值 0 <&#61; offset <&#61; curLen&#64;Overridepublic IString insert(int offset, IString str) {if ((offset < 0)||(offset > this.curLen)){throw new StringIndexOutOfBoundsException("插入位置不合法");}int len &#61; str.length();int newCount &#61; this.curLen&#43;len;if (newCount > strValue.length) {//如果添加新的字符串进去容量不够allocate(newCount);}for (int i &#61; this.curLen - 1;i >&#61; offset;i--){strValue[len&#43;i] &#61; strValue[i];//从offset开始向后移动len个字符}for (int i &#61; 0;i < len;i&#43;&#43;){strValue[offset&#43;i] &#61; str.charAt(i);}this.curLen &#61; newCount;return this;}//删除&#xff0c;从begin 到 end-1&#64;Overridepublic IString delete(int begin, int end) {if (begin < 0){throw new StringIndexOutOfBoundsException("起始位置不能小于0");}if (end > curLen){throw new StringIndexOutOfBoundsException("结束位置不能大于串当前长度"&#43;curLen);}if (begin >&#61; end){throw new StringIndexOutOfBoundsException("开始位置不能大于等于结束位置");}//从end开始的串向前移动到从begin开始的位置for (int i &#61; 0;i < curLen-end;i&#43;&#43;){strValue[begin&#43;i] &#61; strValue[end&#43;i];}curLen &#61; curLen-(end - begin);return this;}//连接操作&#xff0c;把str串连接到当前串的后面&#64;Overridepublic IString concat(IString str) {return insert(curLen,str);}//将当前串与目标串进行比较&#xff0c;若当前串大于str&#xff0c;则返回一个整数&#xff0c;等于返回0,小于&#xff0c;返回-1&#64;Overridepublic int compareTo(IString str) {//求出当前串与带比较串的长度&#xff0c;并把较小值赋值到nint len1 &#61; curLen;int len2 &#61; ((SeqString) str).curLen;int n &#61; Math.min(len1,len2);char[] s1 &#61; strValue;char[] s2 &#61; ((SeqString) str).strValue;int k &#61; 0;while (k<n){char ch1 &#61; s1[k];char ch2 &#61; s2[k];if (ch1 !&#61; ch2){return ch1 - ch2;//返回不相等字符的数值差}k&#43;&#43;;}return len1 - len2;}/** Brute-Force模式匹配算法** *///返回模式串t在主串中从start开始的第一次匹配位置&#xff0c;匹配失败时返回-1public int indexOf_BF(IString t,int start){//当主串比模式串长时进行比较if (this !&#61; null && t!&#61;null && t.length()>0&&this.length()>&#61;t.length()){//i表示主串中某个子串的序号int sLen,tLen,i &#61; start,j &#61; 0;sLen &#61; this.length();tLen &#61; t.length();while ((i<sLen)&&(j<tLen)){if (this.charAt(i)&#61;&#61;t.charAt(j)){//如果一切安好,继续比较后面的字符i&#43;&#43;;j&#43;&#43;;}else {i &#61; i-j&#43;1;//继续比较主串中的下一个子串&#xff0c;这边i其实只是加了1&#xff0c;昂&#xff0c;you know&#xff0c;细品j &#61; 0;//模式串下标归0}}if (j>&#61;t.length()) {//此时从循环杀出来的时候&#xff0c;如果j>&#61;t.length,说明匹配成功了return i - tLen;//匹配成功&#xff0c;返回子串序号&#xff0c;这里返回的是字符串首个的index}else {return -1;//匹配失败&#xff0c;返回负一}}return -1;//匹配失败&#xff0c;返回负一}/** KMP算法** */private int[] getNextVal(IString T){int [] nextVal &#61; new int[T.length()];int j &#61; 0;int k &#61; -1;nextVal[0] &#61; -1;while (j<T.length()-1){if (k &#61;&#61; -1||T.charAt(j) &#61;&#61; T.charAt(k)){j&#43;&#43;;k&#43;&#43;;if (T.charAt(j) !&#61; T.charAt(k))nextVal[j] &#61; k;elsenextVal[j] &#61; nextVal[k];}elsek &#61; nextVal[k];}return nextVal;}public int index_KPM(IString T,int start){int [] next &#61; getNextVal(T);//计算模式串next[]函数值int i &#61; start;//主串指针int j &#61; 0;//模式串指针//对两串从左到右逐个比较字符while (i<this.length()&& j<T.length()){if (j &#61;&#61; -1||this.charAt(i)&#61;&#61;T.charAt(j)){i&#43;&#43;;j&#43;&#43;;}else {j &#61; next[j];//模式串右移}}if (j<T.length()){return -1;}else {return (i-T.length());//匹配成功}}//子串定位操作&#xff0c;搜索与str相等的子串&#xff0c;成功则返回str在当前位置&#64;Overridepublic int indexOf(IString str, int begin) {return index_KPM(str,begin);}
}

数据结构这个系列是我学习时做的笔记&#xff0c;会持续更新&#xff0c;详见我的github&#xff08;地址在文章开头&#xff09;或我的其他博文&#xff0c;感觉不错的话&#xff0c;关注一下吧!


推荐阅读
  • 将字符串数字拆分成单个数字_【LeetCode】842. 将数组拆分成斐波那契序列
    【LeetCode】842.SplitArrayintoFibonacciSequence将数组拆分成斐波那契序列(Medium)(JAVA)题目描述:Givenas ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • 用c语言实现线画、填充图元生成算法多边形_【游戏场景剔除】剔除算法综述...
    之前在做场景优化的过程中,看了不少论文和博客阐述不同剔除算法的原理和过程,自己参照着算法去实现了Hiz和软件剔除。一直想写一篇关于剔除算法的综述 ... [详细]
  • 题目描述:一个DNA序列由ACGT四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个 ... [详细]
  • 上界|下界_重学C++:笔记C++基础容器&C++指针引用
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了重学C++:笔记C++基础容器&C++指针引用相关的知识,希望对你有一定的参考价值。文章目录 ... [详细]
  • 显示中文星期几
    显示中文星期几引自:第一种方法:直接翻译,最笨、最容易想到的方法。Code获得中文星期名称 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
author-avatar
秋凉凉_e1998
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有