第一种形式

数据结构实验之串一:KMP简单应用

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

给定两个字符串string1和string2,判断string2是否为string1的子串。

Input

输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

Output

对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

Sample Input

abc
a
123456
45
abc
ddd

Sample Output

1
4
-1

Hint

Source

cjx

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>char str1[1000001]  ;
char str2[1000001] ;
int next[1000001] ;void set()
{int j = -1;int i = 0 ;int len =strlen(str2) ;next[0] = -1 ;while(i<len){if(j == -1 || str2[i] == str2[j]){i++ ;j++ ;next[i] =j ;}else j = next[j] ;}
}int find()
{int len1 , len2 ;int i ,j ;len1 = strlen(str1) ;len2 = strlen(str2) ;i = 0 ; j = 0 ;while(i<len1&&j<len2){if(str1[i] == str2[j] || j == -1){i++ ;j++ ;}else j = next[j] ;}if(j == len2 ){return i-len2+1 ;}else return -1 ;
}int main()
{int  pos ;while(~scanf("%s %s",str1,str2)){set() ; //构建next数组pos = find() ; //返回子串在主串的位置printf("%d\n",pos) ;}return 0 ;
}

第二种形式(对next数组的优化)

题同上

#include<stdio.h>
#include<string.h>
#include<stdlib.h>char a[1000001] ;
char b[1000001] ;
int next[1000001] ;void set()
{int len = strlen(b)  ;int i = 0 ;next[0] = -1 ;int j = -1 ;while(i<len){if(j == -1||b[i] == b[j]){i++ ;j++ ;if(b[i]!=b[j]){next[i] = j ;}else next[i] = next[j] ;}else j = next[j] ;}
}int kmp()
{int l1 = strlen(a) ;int l2 = strlen(b) ;int i = 0 ;int j = 0 ;while(i<l1&&j<l2){if(j == -1||a[i] == b[j]){i++ ;j++ ;}else j = next[j] ;}if(j == l2)return i - l2 +1  ;else return -1 ;
}int main()
{while(~scanf("%s",a)){scanf("%s",b) ;set() ; //创建next数组int d = kmp() ;printf("%d\n",d) ;}return 0 ;
}

第三种形式(最大长度表)

Good Luck!

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

我们都知道,前缀就是一个单词的前几个字母(长度小于单词长度);后缀就是一个单词的后几个字母(长度小于单词长度)。例如:Hello,{H,He,Hel,Hell}都是Hello的前缀,{ello,llo,lo,o}都是Hello的后缀。现在,给你一个字符串String,你的任务是找出一个字串s,s既是String的前缀,又是String的后缀,并且s也出现在String的中间部分(既不是前缀,也不是后缀),s的长度越长越好。

Input

输入一个N,接下来N行,每行一个字符串String,String长度len( 1 <= len <= 1000000)。

Output

输出只有一行,如果有符合条件的s,输出长度最长的s,如果没有,输出“Bad Luck!”(不含引号)。

Sample Input

3
abcabcabcabcabc
papapapap
aaabaaaabab

Sample Output

abcabcabc
papap
Bad Luck!

Hint

Source

GLSilence

代码如下:

import java.util.Scanner;public class Main{static int next[] = new int[1000001] ; public static void main(String[] args) {Scanner sc = new Scanner(System.in) ; int t= sc.nextInt() ; sc.nextLine(); while(t-->0){String str = sc.nextLine() ;setNext(str) ;int len = str.length() ; if(len<3||next[len-1]==-1){System.out.println("Bad Luck!");}else {int l = len-1; boolean tag = false  ;while(next[l]!=-1){if(str.indexOf(str.substring(0,next[l]+1),1)!=len-1-next[l]){System.out.println(str.substring(0,next[l]+1));tag = true ; break ; }l =  next[l] ; }if(!tag)System.out.println("Bad Luck!");}}sc.close() ; }private static void setNext(String str) {int j ;   j = -1 ; next[0] = -1 ;  for(int i= 1 ;i<str.length()  ;i++){while(j!=-1&&str.charAt(i)!=str.charAt(j+1))j = next[j] ; if(str.charAt(i) == str.charAt(j+1))j++ ; next[i] = j ; }}
}

参考文章:https://blog.csdn.net/v_JULY_v/article/details/7041827

KMP算法next数组构建形式(几种常见的形式+例题)相关推荐

  1. html怎么创建数组,js创建数组的三种方法 JS数组去重的几种常见方法

    JS数组有哪几种定义方式? js 里创建一个数组 那几种方式有什么区别吗?a = new Array(); b = []; 性能问题吗?? function clear(arr) { // 1 如何获 ...

  2. 【文文殿下】浅谈KMP算法next数组与循环节的关系

    KMP算法 KMP算法是一种字符串匹配算法,他可以在O(n+m)的时间内求出一个模式串在另一个模式串下出现的次数. KMP算法是利用next数组进行自匹配,然后来进行匹配的. Next数组 Next数 ...

  3. KMP 算法Next数组

    导读 KMP算法是一种模式匹配的改进算法,其中重要的一步就是对于Next数组的求解,下面就来聊聊这个问题. 求解方法 第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据 ...

  4. KMP算法next数组详解

    ==> 学习汇总(持续更新) ==> 从零搭建后端基础设施系列(一)-- 背景介绍 KMP算法的核心就是利用已匹配的信息来指导模式串的匹配.这里的已匹配信息叫做部分匹配表,也叫做next数 ...

  5. KMP算法NEXT数组纯手工生成

    用一个实际的例子来说明,经历了看懂,看不懂,看懂,看不懂,看懂...后我终于决定把它记下来了. 例子字符串为:abaabaca 首先可以肯定,第一个位置永远位0,第二个位置永远为1.那么可以初始化如下 ...

  6. etc的常见算法_(转)8种常见机器学习算法比较

    机器学习算法太多了,分类.回归.聚类.推荐.图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验.通常最开始我们都会选择大家普遍认同的算法,诸如SV ...

  7. JavaScript 数组拼接打印_8种常见数据结构及其Javascript实现

    摘要: 面试常问的知识点啊- 原文:常见数据结构和Javascript实现总结 作者:MudOnTire Fundebug经授权转载,版权归原作者所有. 做前端的同学不少都是自学成才或者半路出家,计算 ...

  8. JS数组合并的7种常见方法

    前言 项目过程中,经常会遇到 JS 数组合并的情况,时常为这个纠结.这里整理一下 1.ES6解构 [-arr, -arr2] 会生成新的数组 let arr = [1, 2] let arr2 = [ ...

  9. JS数组合并的8种常见方法

    1.ES6 解构 [...arr, ...array] 不改原数组值,生成新的数组. 2.遍历添加 array.forEach(item => {arr.push(item) }) 遍历方法:f ...

最新文章

  1. 栈相关经典题:每日温度
  2. 用分类映射的办法分类两条夹角为0.3度的直线
  3. PM应该找哪些副业?
  4. 在数据库什么是主键与外键
  5. 美国计算机科学专业申请要求,美国计算机科学专业好申请吗?申请要求高不高...
  6. cobbler的dhcp服务_Cobbler服务器安装部署
  7. Mybatis insert返回主键ID
  8. 使用Docker启动Kafka-Manager
  9. linux添加硬盘不重启(vmware下或者虚拟机下面)
  10. 数组维度超过了支持的范围_数组公式基础:多值和单值结果_
  11. Spark Job Scheduling
  12. sublime text3 eslint 安装教程
  13. 基于百度万年历定制化 2
  14. 小白教程系列——MultiDesk连接服务器
  15. SourceOffsite安装配置
  16. 英特尔宣布CEO换帅,消息一出股价大涨
  17. LMD VCL Complete 2020版功能推进
  18. app.run 相关参数 flask配置文件
  19. 陀螺产业区块链第九季 | 如何用区块链搭建营销激励模型?
  20. 使用cairo和freetype进行字体布局和渲染

热门文章

  1. Android端地图,百度地图学习(II)-Android端的定位
  2. 帝国的余辉(ATT)(二)
  3. 联想笔记本没有wlan这一选项?
  4. haribote系统调用 工程管理及应用程序阅读注释
  5. ros gazebo 仿真出现No p gain specified for pid的解决方法
  6. springboot集成elastic job
  7. 用javascript实现五子棋(二)
  8. CSS -- CSS背景设置总结(纯色背景、背景图片)
  9. gluster快照创建
  10. 【基于C++个人编程】中小学数学出题系统