精华内容
下载资源
问答
  • 幸福字符
    2021-04-24 12:27:26

    java 动态拼接字符串,Java 字符串拼接效率分析及最佳实践,java字符串拼接,java如何拼接字符串

    在JAVA 中拼接两个字符串的最简便的方式就是使用操作符”+”了。如果你用”+”来连接固定长度的字符 串,可能性能上会稍受影响,但是如果你是在 循环中来”+......

    在 Java 中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它。所以在我们 拼接字符串的时候,创建了一个新的字符串,旧的被垃圾回收器所标记。 如果......

    怎样使拼接HTML字符串更... 21页 免费 字符串拼接 2页 免费 sql基础操作之字符串拼接... 2页 免费 JavaString 字符串拼接,... 4页 2下载券 喜欢......

    Java 字符串的方法 1 、length() 字符串的长度 例:char ch...

    Java中的JDBC常用的连接字符串_六年级英语_英语_小学教育_教育专区。JDBC连接各种数据库的连接字符串Java 中的 JDBC 常用的连接字符串 1. Microsoft SQLServer(htt......

    java 中字符串操作方法整理本篇文章和本人写的“java 中文件操作大全”一样,都是本人工作学习中总结所得,不断更新,不断 完善。 字符串类基本概念 一.Java 字符......

    字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。 字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的 ......

    { 1/4页 Java 程序:String 字符串处理算法。 int index...

    () 连接两个字符串 14 、replace() 替换 它有两种形式, 第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替 换,形式如下: String replace(......

    JS字符串的拼接用法_中职中专_职业教育_教育专区。JS 1 toGMTString() 方法可根据格林威治时间 (GMT) 把 Date 对象转换为字符 串,并返回结果。 语法 dateObject......

    Java 实现字符串的匹配广州疯狂软件学院拥有三大课程体系包括:java 课程,...

    将字符串作为内置的对象处理允许 Java 提供十分丰富的功能特性以方便处理字符串。如比较两个字符串,搜索子串, 连接字符串以及改变字符串中的字母的大小写。而且 ......

    JAVA的整型与字符串相互转换_计算机软件及应用_IT/计算机_专业资料。自己的整理笔记 JAVA 的整型与字符串相互转换 JAVA 的整型与字符串相互转换 1 如何将字串 ......

    字符串| java| java实现固定格式字符串输出_计算机软件及应用_IT/计算机_专业资料。java 编程实现对字符串的操作,完成固定格式的输出,如输出 12345 和 abcdefg 输......

    Java 中数值型,字符型及字符串的相互转换 Java 中数值型,字符型及字符串的相互转换由广州疯狂软件教育 java 培训分 享: 刚开始学习 Java 不就前些时日被转换......

    JAVA中 我要将字符串以空格为标记分割成多个字符串_计算机软件及应用_IT/计算机_专业资料。JAVA 中 我要将字符串以空格为标记分割成多个字符 串,并将分割后的......

    java 中 String 的常用方法 1、length() 字符串的长度 例:...

    java 字符串生成器 StringBuilder 类是动态的字符串类,它可以动态的执行添加、删除、插入等 字符串的编辑操作。该类的常用方法说明如下。 ? append()方法 append......

    第四讲java数组和字符串_数学_自然科学_专业资料。个人收集整理-ZQ 概述 ...

    小学升初中的语文考试中出现了不少的满分作文,很多的满分作文都写得非常不错,值得那些即将小升初的同学的参考和学习,这样子才能强化语文写作,也使写作水平得到一定的提高,小编整理了一些小升初的满分美文供同学

    网上热捧书《别笑,我是高考(论坛)零分作文》真实性受质疑□晚报记者 张骞 报道当高考生都在朝高考满分作文努力时,近来,一本刚出版不久的名为《别笑,我是高考零分作文》的书,俨然摆出一副为零分作文“正

    好的作文不怕没人发现,下面是小编整理的高中满分作文,欢迎阅读。  高中满分作文一:智者若树  春花的智慧在于燃尽生命的怒放,于是有了草长莺飞,最美人间四月天。夏蝉的智慧在于蛰伏地底十七年,于是有了

    一个把祖国花朵培养成材之地——校园。  校园,它有着神圣的使命。  校园一个赋有巨大责任的胜地,它肩负着培养学生的责任,它让我们懂得了如何做人,提高了我们的素质,教育了我们,把我们培养成为有用得人

    抵达不了的地方叫远方,多少人就这样一直在路上。  ——题记  人们常爱问:“你的梦想是什么呀?”  我傻傻地一笑,“环游世界!”  虽然,我知道这是一个美丽而残酷的世界。  当我第一次见到世界的雏

    一、 环保  1 Its our duty to protect our environment。  2 It is very important to take care of our en

    月考刚一完,数学老师便给每人发了一张参考答案,我向纸上扫了一遍,一个个答案都合我意,我心中不由得得意了:满分!可冷不防半路杀出个程咬金,最后一个12分题参考答案是“17”,而我的答案却是“11”!

    满分作文老师我刚刚从别的学校转来,已经上四年级了。虽然时间不长,但是我新认识了许多老师,在这些老师中,我最喜欢我的语文老师姜玉宏了。姜老师今年三十岁左右,中等个子,长得很漂亮。一头乌黑的秀发披散在脑

    “海上升明月,天涯共此时。”我一直期盼的中秋节终于来到了。小编今天为大家带来中秋满分作文,让我们一起欣赏一下吧。  中秋满分作文【1】  怀着无比轻快的心情,我们迎来了上中学以来的第一个中秋佳节。

    我是一个活在想象之中的人。每天呢,都过分地沉浸于自己的想象里,不可自拔,甚而自得其乐,沾沾自喜。  或许是此缘故吧,在面对这个现实社会,却不善交际应酬,也别说巧言令色。不知圆滑世故,更不懂察颜观色

    我们匆匆地告别,走向各自的远方,没有语言,更没有眼泪,只有永恒的思念和祝福,在彼此的心中发出深沉的共鸣。下面小编为大家搜索整理了分别满分作文,希望对大家有所帮助。  不是我不懂事,而是你们不懂我做

    在逆境中是什么引导你屡仆屡起?在顺境中又是什么指导你不断攀升?下面是小编为你整理了适应满分作文,希望能帮助到您。  适应满分作文(1)  诗人雪莱说过:“如果你很珍惜自己的羽毛,不让翅膀受一点伤,

    “年味”是一个名词。那什么是年味?年味就是全家团圆的喜乐气氛;就是晚辈孝敬长辈围坐在桌前敬的那一杯酒;就是屋外烟花闪耀飘进鼻内的一股幽香;就是妈妈忙前忙后做的一顿年夜饭;就是玩着烟花时仿佛又回到童

    对话1  一直固执地相信自己十五年前曾经来过这里,尽管那时的我步履蹒跚的连路都走不好,这种话听起来蹩脚。  依然固执的相信,当时我就站在山海关的某一个角落,静静地见证了一场死亡的盛典,一次诗性的绽

    追梦,就要以蓄势待发的磅礴气势做到不鸣则已,一鸣就必须惊得天下人!这是小编给大家推荐的追梦满分作文,一起来看看吧。  【篇一:追梦的旅途】  梦想是大家公共的财产,每个人都有梦想,都有为梦想而奋斗

    作文告别(共6篇)告别 满分作文告别过去﹒ 告别网吧我亲爱的网吧,自从与你相识以来,我体验到了从未有过的幸福。我想玩游戏,你陪我玩;我想看电影,你陪我看;我想聊天,你陪我聊……你总是心甘情愿地陪伴着我。你的温柔,你的体贴,让我倍感温暖。于是我上课时想你,下课时想你...

    全国卷1范文(共6篇)2014高考全国新课标卷I满分作文全国新课标卷I 以“两人过独木桥”为材料作文(新课标I卷适用于河北、河南、山西、陕西考区) 真题再现阅读下面的材料,根据要求写一篇不少于800宇的文章。(60分)“山羊过独木桥”是为民学校传统的团体比赛项目。规则是,双方队员两...

    你是我的作文600(共4篇)中考满分作文600字:你是我最好的朋友她,我最好的朋友之一。短短的黑发,散发着“伊甸园”独有的香气。眼神中每每都会闪烁着渴求的目光。不爱穿裙子,甚至从小到大只穿过一次裙子。只穿t恤、长裤、厚重的棉袄„„活脱脱的一个假小子。为了这事儿还闹了一个哭笑不...

    作文及分析(共6篇)2013中考满分作文及评析(一)2013年中考满分作文赏析(一)2013海南中考满分作文及评析:今天属于我整天沉浸在紧张的学习中,唉,累死我了!今天我要过属于自己的周末,今天属于我。早上,一睁开眼就望见窗外投来的一缕阳光,这阳光聚集到地上形成一个小光点,恍恍惚...

    作文感动(共6篇)感动类满分作文感动类的满分作文幸福的感动有一种感觉叫做幸福,有一种幸福叫做感动。而我,正是会享受这种幸福的一个幸运女孩。那年冬天,雪下得纷纷扬扬。除夕前那晚,我趴在窗边看雪。灯光中满是飞舞的雪片,仿佛抑制不住满心的喜悦。接连不断的鞭炮声,洋溢着春节...

    全国卷作文(共6篇)2016年全国卷1高考满分作文2016年全国卷高考满分作文要求:1、结合材料的内容和寓意,选好角度,确定立意,明确文体,自拟题目;2、不要套作,不得抄袭。一点进步,一种人生暮色暗淡,残阳如血。北方的风凛冽地刮着,刮得人生疼。一个十八岁的少女坐在河边,手里拿着...

    作文《幸福》(共6篇)“幸福”话题满分作文 例文“幸福”话题作文精选及点评(6篇)幸福是什么?幸福在哪里?人们一直在追问、在寻找。其实,幸福原来就是父母给你的一杯清茶,老师给你的赞许的目光;幸福原来就是你给别人的一声喝彩,你对别人的一次宽容;幸福原来就是亲近自然的经历,...

    你真作文(共6篇)《有你真好》满分作文2010年邵阳中考满分作文:有你真好有你真好有你真好,孤单的时候也不寂寞。有你真好,失落的时候也不彷徨。有你真好,要输的时候也不放弃。一“明月几时有”又是一年中秋节,月亮仍旧是那个月亮,可是在我们眼中它有点孤单。这是我在异乡求学的第...

    更多相关内容
  • 摘要 腾兴网为您分享:Linux使用sed命令添加字符串的方法,幸福钱庄,小睡眠,小米社区,微光等软件知识,以及手机节拍器,vr全景视频,鞠躬的表情包,内存变硬盘,高德地图app,合生元妈妈100分销平台,jpg转换成pdf...

    摘要 腾兴网为您分享:Linux使用sed命令添加字符串的方法,幸福钱庄,小睡眠,小米社区,微光等软件知识,以及手机节拍器,vr全景视频,鞠躬的表情包,内存变硬盘,高德地图app,合生元妈妈100分销平台,jpg转换成pdf版,影院,瑜伽,轮播图,桌面搜索,猴腮雷,微信文件管理,quickset,ubuntu编辑器等软件it资讯,欢迎关注腾兴网。添加 Linux字符串 有很多种方式,有一种就是在文本的首尾行添加字符串。本文就来介绍一下Linux使用sed命令添加字符串的方法。 用sed命令在行首或行尾添加字符的命令有以下几种: 假...

    添加Linux字符串有很多种方式,有一种就是在文本的首尾行添加字符串。本文就来介绍一下Linux使用sed命令添加字符串的方法。

    用sed命令在行首或行尾添加字符的命令有以下几种:

    假设处理的文本为test.file

    4aac11c62928ad0d7065a504e3e0e99c.png

    在每行的头添加字符,比如“HEAD”,命令如下:

    sed ‘s/^/HEAD&/g’ test.file

    在每行的行尾添加字符,比如“TAIL”,命令如下:

    sed ‘s/$/&TAIL/g’ test.file

    运行结果如下图:

    0c38b73f48a1921a02e510f5bbb1f2a4.png

    几点说明:

    1.“^”代表行首,“$”代表行尾

    2.‘s/$/&TAIL/g’中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了

    例:

    671f91ba551b41a9ab3ab347cde37176.png

    相关推荐

    展开全文
  • java中如何将字符型转换字符串java截取指定字符串中的某段字符如何实现?恨往往更容易记住一个人,小编连恨都不愿施舍给你。例如:字符串=“房估字(2014)第YPQD0006号” 小编想要得到 第与号 之间的“YP连大姨妈都会...

    java中如何将字符型转换字符串

    java截取指定字符串中的某段字符如何实现?恨往往更容易记住一个人,小编连恨都不愿施舍给你。

    例如:字符串=“房估字(2014)第YPQD0006号” 小编想要得到 第与号 之间的“YP连大姨妈都会在女人老了之后离你而去更何况男人。

    5dab0212247d1d654b523275c930620e.png

    如下图,给你贴出了代码段。可以利用字符串的substring函数来进行截龋 其中,substring函数有两个参数: 浮世若不扰攘,恩恩怨怨也就荡不开了。然而江湖终究是一场华丽的泡影,生灭荣枯转眼即为他人遗忘。

    第一个参数是开始截取的字符位置。(从0开始)

    第二个参数是结束字符的位置+1。(从0开始) indexof函数的作用是查找该字符串中的某请不要再出现在小编的梦里,小编承担不了醒来的落空。

    java中怎么进行字符串替换?小编不想去讨好你了换句话说小编不想浪费时间去感动自己了

    小编要将test.doc 最后的doc替换成html,怎么弄呢?你知道,差一点没得到,会让人不忿,而差得很远,就会让人平静。

    replace方法 该方法的作用是替换字符串中所有指定的字符,然后生成一个新的字符串。经过该方法调用以后,原来的字符串不发生改变。例如: String s = “abcat”; String s1 = s.replace(‘a’,‘1’); 该代码的作用是将字符串s中所有的字符a替换哪一年,哪一个人,让一生改变?他不说。爱情,对有些人来说,是血液里跳动,始终沉默如墨夜的声音。

    java字符串拼接的几种方式

    String类的方法: ①利用运算符"+" ②public String concat(String str)进行字符串的拼接操作 StringBuffer的方法: ①public StringBuffer append(String str)将str添加到当前字符串缓冲区的字符序列的末尾 ②public StringBuffer insert(int offse不是一辈子的人,不说一辈子的话,不勉强,能放下。

    java 截取字符串第一个字符小编们忙碌的目的往往是:享受生活回报父母满足爱人,想无私;可小编们忙碌的结果往往是:享受不了生活远离了父母冷落了爱人,成了自私。

    如:String s="administrator" 小编想解决第一个字符a 字符串的长度 和内那些视感情如游戏的人,你们永远不知道被你们玩的那些人有多爱你们。

    java 截取字符串可以直接调用String的.subSequence方法。代码为s.subSequence(0, 1); API中的方法定义为public CharSequence subSequence(int beginIndex,int endIndex),返回一个新的字符序列,Returns a character sequence that is a subseq你孑然一身,有着别人读不懂的忧伤,看不明的沧桑。

    java中字符串长度的方法是什么,返回值是什么类型

    可以通过”length“方法来获取字符串长度,返回值类型是number类型(整形),举例: String str = "aaaaaabaaaabaaa";//定义一个字符串 int length = str.length();//获取到长度值 System.out.print(length);//输出长度结果 输出结果:15. 备注:那一瞬,低头静听中,漫漫时光被缩短成了一首歌的距离,可蓦然抬头时,只见维多利亚港湾的迷离灯火。原来已是隔世。

    第八题: 分析以下需分享,并用代码实现 1.键盘录入一个字符串 2.将该字符串轮回的路上,不管怎么忘记前世,却还是在模糊的大脑里记得有一个身影?而小编已不能确定那个人还是不是你?但小编确定的是在遗失的去爱情里,藏着小编对你的眷恋。

    代码如下: import java.util.Arrays;import java.util.Scanner;public class App {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 1.键盘录入一个字符串String str = scanner.nextLine();char[] chars 如若相爱,便携手到老。如若错过,便愿她安好。

    java 怎么对比两个字符串的每个字符小编想你的时候最缠绵,无论小编们相距多远,前面的路有多坎坷,只想说:你是小编今生最大的幸福。

    /*** 判断字符串相似* * @param str1* 比较串* @param str2* 被比较串* @return*/public static boolean isLike(String str1, String str2) {HashMap list = new HashMap();char[] cs1 = str1.toCharArray();char[] cs2 = str2.toCharArray();ch小编想装疯卖傻过一生,可以听不到那些刺耳,看不见那些揪心,感觉不出那些心疼。

    以上就是四十五资源网为大家整理的java字符串方法 java 怎么对比两个字符串的每个字符内容,如果觉得本站更新的资源对您有帮助 不要忘记分享给您身边的朋友哦!

    展开全文
  • 导读字符串模式匹配是常见的算法之一,在实际生活中有较高的使用频率。本文详细介绍两种最常见的字符串模式匹配算法:朴素模式匹配KMP模式匹配字符串模式匹配,也称子串的定位操作,通俗的说就是在一个主串中判断...

    导读

    字符串模式匹配是常见的算法之一,在实际生活中有较高的使用频率。本文详细介绍两种最常见的字符串模式匹配算法:朴素模式匹配

    KMP模式匹配

    字符串模式匹配,也称子串的定位操作,通俗的说就是在一个主串中判断是否存在给定的子串(又称模式串),若存在,则返回匹配成功的索引。如:

    主串:zhuanlanzhihu

    子串:zhihu

    主串中包含子串"zhihu",说明匹配成功,且返回的索引为:8

    注:本文所有出现的字符串的下标都是从0开始标记,并用Java语言实现算法。

    朴素模式匹配

    串的朴素模式匹配算法也称为BF(Brute-Force)算法,其基本思想是:从主串的第一个字符起与子串的第一个字符进行比较,若相等,则继续逐对字符进行后续的比较;若不相等,则从主串第二个字符起与子串的第一个字符重新比较,以此类推,直到子串中每个字符依次和主串中的一个连续的字符序列相等为止,此时称为匹配成功。如果不能在主串中找到与子串相同的字符序列,则匹配失败。BF算法是最原始、最暴力的求解过程,但也是其他匹配算法的基础。下面通过具体Demo演示该算法的基本思想。

    主串:zhihzhiuzhihu

    子串:zhihiu

    注:绿颜色代表匹配成功的字符,红颜色代表匹配失败的字符

    首先,将主串的第一个字符与子串的第一个字符进行比较,即主串中的第一个字符'z'与子串的第一个字符'z'进行比较,二者相等,依次继续比较,主串第一个字符后面的'h'、 'i' 、'h'分别与子串第一个字符后面的'h' 、'i'、 'h'进行比较,都分别对应相等,继续比较主串的'z'与子串的'u',因为'z'与'u'不相等,则趟匹配失败。

    这时,将主串的指针回溯到第一次比较开始字符的下一个字符即'h',子串从第一个字符'z'与'h'比较,'z'与'h'不相等,进行下一趟比较。

    同理依次比较,主串的'i'与'z'不相等,本趟匹配失败。继续从主串的下一个字符'h'与子串的第一个字符'z'进行比较,'h'与'z'不相等,本趟匹配失败。

    同理,继续从主串的下一个字符'z'与子串的'z'比较,相等,继续逐次对应比较,'h'与'h'相等,'i'与'i'相等,但后面的对应的'u'与'h'不相等,匹配再次失败。

    主串需要回溯到'z'的下一个字符'h'处,子串从头来继续匹配,即'h'与'z'不相等;主串的下一个字符继续与子串第一个字符比较,即'i'与'z'比较不相等;主串的下一个字符继续与子串第一个字符比较,即'u'与'z'不相等。

    最后,主串的下一个字符'z'与子串的第一个字符'z'比较相等,继续逐次比较,这时发现对应相同位置的字符都相等,至此,在主串中成功匹配子串,并且位置为:8

    根据算法的基本思想,编写完整的BF代码,为了方便起见,测试使用main()方法。

    import java.util.Scanner;

    public class BF {

    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    System.out.println("Please input main string:");

    String mainString = scanner.nextLine();// 从标准输入读取主串System.out.println("Please input sub string:");

    String subString = scanner.nextLine();// 从标准输入读取子串scanner.close();

    BF.match(mainString, subString);

    }

    /*** @param s* 主串* @param t* 子串*/

    public static void match(String s, String t) {

    int index = 0;// 成功匹配的位置int sLength = s.length();// 主串长度int tLength = t.length();// 子串长度if (sLength < tLength) {

    System.out.println("Error.The main string is greater than the sub string length.");

    return;

    }

    int i = 0;

    int j = 0;

    while (i < sLength && j < tLength) {

    if (s.charAt(i) == t.charAt(j)) {// 判断对应位置的字符是否相等i++;// 若相等,主串、子串继续依次比较j++;

    } else {// 若不相等i = i - j + 1;// 主串回溯到上次开始匹配的下一个字符j = 0;// 子串从头开始重新匹配}

    }

    if (j >= tLength) {// 匹配成功index = i - j;

    System.out.println("Successful match,index is:" + index);

    } else {// 匹配失败System.out.println("Match failed.");

    }

    }

    }

    测试结果:

    KMP模式匹配

    KMP模式匹配算法,是一个效率非常高的字符串匹配算法。其全称是Knuth–Morris–Pratt string searching algorithm,是由三个人于1977年共同发表的,其中就有他:

    他是谁呢?他就是高德纳(Donald Ervin Knuth),堪称计算机科学理论与技术的经典巨著《计算机程序设计的艺术》的作者,这本书被《美国科学家》杂志列为20世纪最重要的12本物理科学类专著之一,与爱因斯坦《相对论》、狄拉克《量子力学》、理查·费曼《量子电动力学》等经典比肩而立,他也荣获1974年度的图灵奖。闲话少说,回归正题。在学习KMP算法之前需要明白什么是字符串的前缀、后缀,以及前后缀相同元素长度概念。

    前缀:指字符串中除了最后一个字符以外,其余字符的全部头部顺序组合。

    后缀:指字符串中除了第一个字符以外,其余字符的全部尾部顺序组合。

    前后缀相同元素长度:指字符串所有的前缀与后缀字符依次相同的长度。

    首先,KMP算法是对传统BF算法的改善,怎么改善的呢?在BF算法中,每当主串与子串对应位置的字符匹配失败时,主串的位置指针就往前回溯,子串位置指针从头开始,然后重新匹配。实质上,每当匹配失败时可以得出两个结论:本趟匹配失败

    子串当前匹配失败字符之前的字符是匹配成功的

    BF算法正是没有利用第二条结论的信息,所以效率低。而KMP算法充分利用了第二条结论的信息,从而避免一些明显不合法的移位,加快匹配过程。如:

    当'D'与'A'匹配失败,按照BF算法是不假思索的把子串整体右移一位,主串不动,然后再逐次对应比较。而KMP算法的核心思想是尽可能的让子串向右远移,每次匹配失败后子串向右移动越远,比较的次数减少了,算法的性能自然就提高了。

    先看子串的子串的各个前缀后缀的最大相同元素长度分别为:

    那么究竟如何判断每次匹配失败后子串需要尽可能地右移多少位呢?这时,我们观察子串失配位置前的字符,也就是:ABDAB这部分,ABDAB的前后缀相同元素是:AB,也就是说ABDAB的前后缀相同元素长度为:2,根据上表可知,失配时,子串向右尽可能远移的位数为:已匹配字符数 - 失配字符的上一位字符所对应的最大长度值,即需要右移3位,而这比BF算法每次失配只右移一位少了两趟的比较,效率显而易见。这是通过前后缀相同元素长度来判断的,为了能用算法实现该过程,需要引入next数组,next数组表示子串当前匹配失败字符之前的字符串(子串的子串)的前后缀相同元素长度 ,根据上图,可求得next数组如下:

    不难发现,next数组是将前后缀串相同元素长度整体向右移一位,并人为规定next数组的第一个元素值是-1,因为一个字符串的第一个字符的前面不可能有其他字符,所以就不会存在所谓的前后缀相同元素,同理,一个字符串的第二个字符前只有一个字符,并且前缀与后缀只能是字符串的真子集,所以由一个字符构成的字符串是没有前缀与后缀的,也就是说前后缀相同元素长度为0。即:next[0]=-1,next[1]=0

    注:也有人把next[0]规定为0,这并不影响算法的实现

    求出了next 数组后,从而有:每当主串与子串对应字符失配时,子串整体向右移动的最大位数是:失配字符所在的位置 - 失配字符对应的next[]数值

    原理说完,接下来就是最核心的内容是如何通过算法描述next[]数组。

    设子串为“p0p1...pm-1”,当子串的字符pj与主串中相应的字符Si不相等时,因其前j个字符(p0p1...pj-1)已经获得正确匹配,所以若子串中的“p0p1...pk-1”与“pj-kpj-k+1...pj-1”相同,这时让Si与pk进行比较。所以next[]数组应当为:

    根据上述公式,next[]数组的第一个元素值是-1,并且子串当前字符匹配失败时子串前面已匹配正确的所有字符构成的字符串若没有没有共同前后缀(前缀完全与后缀相等),即前后缀相同元素长度为0,即当前匹配失败的位置的next[]数值为0,所以说白了这里的other就是指的是匹配失败时子串的子串没有相同的前后缀。这里最难的是公式的中间部分如何求解max(k),很多博客或书上都是使用两个变量去求解,让人难以理解,这里我用一个变量j去求解。

    从左到右求解一个字符串的各个位置的next[]值,每当右移一个字符,新增的字符X(t.charAt(j-1))需要用到上一个字符B的next[]值,因为B的next[]存放着子串(模式串)的B之前的子串的前后缀相同元素长度,而字符串下标是从0开始的,所以这个长度值在字符串中的指向的是Y(t.charAt(next[j-1])) ,归根结底next[j]是与next[j-1]有关的。详细分成这三种情况:

    若 t.charAt(next[j-1])==t.charAt(j-1)为真,即上图中的Y与X相等,则当前的next[j]=next[j-1]+1

    若 t.charAt(next[j-1])==t.charAt(j-1)为假,即上图中的Y与X不相等,这是需要考虑X是否该串的第一个字符相等,若相等,next[j]=1

    如果上述的两种情况都不成立,也就是说子串(模式串)截止到前一个字符的子串没有共同元素的前后缀,换句话说就是前后缀相同元素长度为0,即next[j]=0

    以下是代码实现next[]数组:

    /*** @param t* 要生成next[]数组的字符串,在KMP算法中是子串(模式串)* @return 给定字符串的next[]数组*/

    public static int[] next(String t) {

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

    next[0] = -1;// 这里规定next[]第1个元素值为-1next[1] = 0;

    int j = 2;// 从给定的字符串的第3个字符(下标从0开始)开始计算next[j]数值while (j < t.length()) {// 从第三个字符开始逐次求解对应的next[]值if (t.charAt(next[j - 1]) == t.charAt(j - 1)) {// 判断Y与X是否相等(X,Y对应上图,下同)next[j] = next[j - 1] + 1;// 若Y与X相等,当前next[j]为上一个next[]数组值加1j++;// 开始自增一个字符,准备下一次求解} else if (t.charAt(0) == t.charAt(j - 1)) {// 若不相等,判断X与子串(模式串)第一个字符是否相同next[j] = 1;// 若相同,找到一个长度为1的相同前后缀,即next[j]为1j++;

    } else {// 若上述两个条件都不满足,即意味着没有相等的前后缀,即next[j]为0next[j] = 0;

    j++;

    }

    }

    return next;

    }

    但是上面的代码细细思考,会发现一个小小的问题。在while循环内部的if语句判断时,t.charAt(next[j-1])==t.charAt(j-1) 当next[j-1]正好等于0时,与下面的else if(t.charAt(0)==t.charAt(j-1))是重复判断的,为了使代码更精炼,应该考虑在第一个if判断语句中添加一个限制条件,即:next[j-1]!=0 这样组成if (next[j-1]!=0 && t.charAt(next[j - 1]) == t.charAt(j - 1)),这样我们就完成了用一个变量j算出next[]数组,大功告成。

    求解出最关键的next[]后,只需要对BF算法基础上略加修改,每次匹配失败时,获得该位置的next[]数值,将这个数值赋予变量j(子串的指针)即可。这样就能保证每次匹配失败后让子串右移尽可能远的距离,这也就是KMP算法的核心所在。

    以下是KMP算法的完整代码,同样也是在main()中做了测试:

    import java.util.Scanner;

    /*** @author RunDouble**/

    public class KMP {

    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    System.out.println("Please input main string:");

    String mainString = scanner.nextLine();// 从标准输入读取主串System.out.println("Please input sub string:");

    String subString = scanner.nextLine();// 从标准输入读取子串scanner.close();

    KMP.kmp(mainString, subString);

    }

    /*** @param t* 要生成next[]数组的字符串,在KMP算法中是子串(模式串)* @return 给定字符串的next[]数组*/

    public static int[] next(String t) {

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

    next[0] = -1;// 这里规定next[]第1个元素值为-1next[1] = 0;

    int j = 2;// 从给定的字符串的第3个字符(下标从0开始)开始计算next[j]数值while (j < t.length()) {// 从第三个字符开始逐次求解对应的next[]值if (next[j - 1] != 0 && t.charAt(next[j - 1]) == t.charAt(j - 1)) {// 判断Y与X是否相等(X,Y对应上图,下同)next[j] = next[j - 1] + 1;// 若Y与X相等,当前next[j]为上一个next[]数组值加1j++;// 开始自增一个字符,准备下一次求解} else if (t.charAt(0) == t.charAt(j - 1)) {// 若不相等,判断X与子串(模式串)第一个字符是否相同next[j] = 1;// 若相同,找到一个长度为1的相同前后缀,即next[j]为1j++;

    } else {// 若上述两个条件都不满足,即意味着没有相等的前后缀,即next[j]为0next[j] = 0;

    j++;

    }

    }

    return next;

    }

    public static void kmp(String s, String t) {

    int[] next = next(t);// 调用next(String t)方法int index = 0;// 成功匹配的位置int sLength = s.length();// 主串长度int tLength = t.length();// 子串长度if (sLength < tLength) {

    System.out.println("Error.The main string is greater than the sub string length.");

    return;

    }

    int i = 0;

    int j = 0;

    while (i < sLength && j < tLength) {

    /** 如果j = -1, 或者当前字符匹配成功(即s.charAt(i) == t.charAt(j)), 都令i++,j++*/

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

    i++;

    j++;

    } else {

    /** 如果j != -1,且当前字符匹配失败, 则令 i 不变,j = next[j], next[j]即为j所对应的next值*/

    j = next[j];

    }

    }

    if (j >= tLength) {// 匹配成功index = i - j;

    System.out.println("Successful match,index is:" + index);

    } else {// 匹配失败System.out.println("Match failed.");

    }

    }

    }

    测试结果:

    总结

    目前所做的字符串模式匹配只是匹配第一个子串出现的位置,要想匹配所有的子串需要对代码略加修改。最后提一下两种算法的时间复杂度。设主串与子串长度分别为m和n,BF算法在最坏的情况下,每一趟不成功的匹配都是在子串的最后的一个字符与主串中相应的字符匹配失败,即在最坏情况下时间复杂度为:O(n*m)。最好的情况是,子串所有字符匹配成功之前的所有次不成功匹配都是子串的第一个字符与主串相应的字符不相同,可得O(n+m)。对于KMP算法的时间复杂度为:O(n)。现在回过头来看KMP算法,只要抓住“主串不回溯,子串往远移”这句话,尽量减少主串与子串的匹配次数以达到快速匹配的目的,问题就能迎刃而解了。具体的实现关键在于如何实现一个next[]数组,这个数组本身包含了子串的局部匹配信息。当然还有其他的串的模式匹配算法,如Boyer-Moore、Rabin-Karp等字符串查找算法。

    到此,本文结束,祝各位新年健康幸福。

    展开全文
  • python:变量和字符

    2021-03-17 19:15:26
    3、python为我们提供了简单的方法:使用三重引号字符串"""内容""" 例9_1: a = """从明天起做一个幸福的人 喂马,砍柴,周游世界 从明天起,关心粮食和蔬菜 我有一所房子,面朝大海,春暖花开 """ print(a) """ 从...
  • join() 拼接元素 参数(有参:就以参数拼接元素,无参:默认以逗号 拼接) 返回值:拼接好的字符串元素; arr.join("- "); 拼接:传参时,就以指定符号连接; 返回值为: 拼接好的字符串元素; 08、array.concat() ...
  • 调用第三方需要手动拼接动态JSON字符
  • java io 读入文件 怎么过滤特殊字符1.io只能在读完之后才能对读出来的数据String数组继续判断。jsp\java如何编写过滤器过滤特殊字符jsp\java 如何编写过滤器过滤特殊字符?在爱情里,总有一个主角和配角,累的永远是...
  • 字符串的拼接-MYSQL

    2021-03-01 10:11:28
    SQL允许两个或者多个字段之间进行计算,字符串类型的字段也不例外。比如我们需要以“工号+姓名”的方式在报表中显示一个员工的信息,那么就需要把工号和姓名两个字符串类型的字段拼接计算;再如我们需要在报表中在每...
  • Java8 遍历List拼接成字符

    千次阅读 2022-03-29 17:41:40
    目前项目中需要拼接字符
  • java之字符串中查找字串的常见方法

    千次阅读 2021-03-05 19:35:15
    1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。函数数名:...
  • java整型转换成字符

    千次阅读 2021-03-06 14:40:38
    二、 实验要求 1、编写一个 Java 程序,在程序中进行字符串与数值型数据的转换。 2、编写一个 Java 程序,在程序中通过键盘输入常用的数据,包括字符串、 整数和......String s="10"; //字符串转换成数值型 a=Byte....
  • UART通信--发送1个字符串 ,是在单片机上操作的,代码可以顺利跑通
  • 最长的美好子字符串 新年开头祝福美满 美好幸福~ 文章专栏:leetcode每日一题《打卡日常》 最近更新:2022年1月29日 leetcode每日一题1342. 将数字变成 0 的操作次数 除夕新气象,所有的不愉快年末清零啦~ 个人...
  • C语言:把数字字符串转换成整型数字不懂时,别乱说;懂得时,别多说;心乱时,慢慢说;没话时,就别说。运行环境:TC2. 把数字字符串转换成整型数字。比如说小编输入一个数字字符当你年轻时,你以为什么都有答案,...
  • python 正则表达式提取某个字符串中的特定字符 实例 需要提取的字符串,如: "['{0: 203, 11: 1627438682 [2021-07-28 10:18:02], 12:36 [通过蓝牙更改错误密码锁定计数], 13: 770449129, 19: 3, 20: 0, 100: ...
  • 结果,该工具能够对三种情绪进行分类(悲伤,愤怒和幸福)。 该项目由Android Mobile Vision,Django,Scikit Learn,Pharser JS和Jquery组成。演示版动画状态Kaio有4个州 如何学习和检测人脸情感Kaio需要学习人类...
  • mysql中的字符串的拼接

    千次阅读 2021-01-27 21:22:10
    字符串的拼接1,Mysql在Java、C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"、"a"+"b"。在MYSQL中也可以使用加号“+”来连接两个字符串,比如下面的SQL:Sql代码SELECT'12'+'33',FAge+'1'FROMT...
  • Python - 数据类型之字符串、数字

    万次阅读 2021-12-13 14:50:06
    数据类型之字符串、数字
  • 反射之动态拼接sql字符串 前言 自己在学习JDBC连接数据库,不用框架手动实现时,个人觉得反射动态拼接sql的思想很好,当然了大家伙觉得好才是真的好(广州好迪,手动狗头),所以才有了本文对该知识点梳理与总结。...
  • C#字符串截取,查找某字符下标

    千次阅读 2021-02-07 13:43:08
    string str = "祝愿天下所有的程序员在2021年阖家幸福安康,财源滚滚进账。"; string newStr = str.Substring(0,str.IndexOf(",")+1); string newStr1 = str.Substring(str.IndexOf(",")+1).
  • 字符串-AC自动机(详细图解)

    千次阅读 多人点赞 2020-09-28 22:49:54
    在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒。小t不幸成为受害者之一。...
  • 2),结束于倒数第三个字符(第二个参数-2),由于结束位置在开始位置的右边,所以得到一个空字符串 第一个参数表示开始位置,第二个表示结束位置,第三个标志步速(step小编知道有一种爱情,叫做与你白头,有一种幸福,叫做...
  • python字符串替换的2种方法

    千次阅读 2021-01-14 03:43:49
    python怎么替换很多特定字符串为其他的字符串python中如何对多个字符快速替换你是小编用心用命去爱的人,到最后终究是过客,你叫小编怎能不难过。python中快速进行多个字符替换的方法小结 先给出结论: 要替换的字符...
  • 【优雅编程之道】之字符串的5点建议

    千次阅读 多人点赞 2017-02-28 20:38:26
    开心一笑【一个本科男找了一个女博士。新春佳节,本科男绐女博士发了一个520元的红包,附言:我爱你。...解决问题初始化字符串的两种选择比较例://第一种初始化字符串方式 String str = "ay"; String str2 = "ay"; Sy
  • 本文主要阐述 JS 字符串内置对象相关例题解析
  • Python 3最重要的新特性大概要算是对文本和二...你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。这是件好事。不管怎样,字符串和字节包之间...
  • c++字符串的比较: 1.比较规则: 1.按顺序从前往后比较 2.同序号的字符按“ASCII”码值比较 3.直到遇到对应字符不等或者字符串结束 2.字符串比较的“运算符”: == > < >=(大于或者等于) <=(小于或者...
  • SQL允许两个或者多个字段之间进行计算,字符串类型的字段也不例外。比如我们需要 以“工号+姓名”的方式在报表中显示一个员工的信息,那么就需要把工号和姓名两个字符 串类型的字段拼接计算;再 如 我们需要在报表中...
  • Python基础——变量及字符串简介

    千次阅读 2021-12-30 17:42:48
    如果非要在字符串的结尾加个反斜杠,则可以利用反斜杠转义: 长字符串 如果希望得到一个跨越多行的字符串,如: 从明天起,做一个幸福的人 喂马,劈柴,周游世界 从明天起,关心粮食和蔬菜 我有一所房子,面朝大海...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,394
精华内容 4,957
热门标签
关键字:

幸福字符