KMP算法(A + B for you again—HDU - 1867 )

简介: KMP算法(A + B for you again—HDU - 1867 )

KMP算法就是求母串中字串的长度或者字串出现的次数,相对于暴力求解的话,KMP算法节省时间,KMP算法就是分两部分next[ ]和kmp中找字串。next[ ]算法是找字串中的前后缀的长度,这样在KMP中寻找时就节省了时间。

next[ ]函数代码:

void get_next(char s2[],int m)
{
  int i=1,j=0;
  nex[0]=-1;//初始next[0]=-1
  while(i<m)
  {
    if(j==-1||s2[i]==s2[j])
    {
      i++;
      j++;
      nex[i]=j;
    }
    else
      j=nex[j];
  }
}


KMP代码:

int kmp(char str1[],char str2[])
{ 
  int i=0,j=0,m;
  n=strlen(str1);
  m=strlen(str2);
  get_next(str2,m);
  while(i<n&&j<m)
  {
    if(j==-1||str1[i]==str2[j])//逐个取寻找
    {
      i++;
      j++;
    }
    else
      j=nex[j];
  }
}

例题解释:

题目:

一般来说,字符串处理存在很多问题。现在你遇到另一个这样的

问题。如果你得到两个字符串,例如“asdf”和“sdfg”,它们之间的加法结果是“asdfg”,

“sdf”是“asdf”的尾子串和“sdfg”的头子串。然而,结果是“asdfghjk”,

当你必须添加“asdf”和“ghjk”并保证最短的字符串,然后最小的词典

第二,其他增加的规则相同。

输入

对于每种情况,有两个字符串(选择的字符只是’a’到’z’),每个字符串的长度不超过10 ^ 5且不为空。

输出

打印本书的最终字符串。打印本书的最终字符串。

Sample Input

asdf sdfg
asdf ghjk

Sample Output

asdfg
asdfghjk

解题思路: 给两个字符串分别作为母串和子串,输出两个和的最短字符串,如abcde+bcdekl结果为abcdekl,就是找第一个字符串的后缀与第二个字符串的前缀相同的最大长度。 注意:如果两个字符串不管谁做母串所得的前缀和后缀的最大长度都一样,则就用strcmp()判断最小字典输出。

程序代码:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int nex[500000],n;
char s[500000],s1[500000];
void get_next(char s2[],int m)
{
  int i=1,j=0;
  nex[0]=-1;
  while(i<m)
  {
    if(j==-1||s2[i]==s2[j])
    {
      i++;
      j++;
      nex[i]=j;
    }
    else
      j=nex[j];
  }
}
int kmp(char str1[],char str2[])
{
  
  int i=0,j=0,m;
  n=strlen(str1);
  m=strlen(str2);
  get_next(str2,m);
  while(i<n&&j<m)
  {
    if(j==-1||str1[i]==str2[j])
    {
      i++;
      j++;
    }
    else
      j=nex[j];
  }
  if(i==n)
    return j;
  else
    return 0;
}
int main()
{
  int i,k1,k2,j;
  while(cin>>s>>s1)
  {
    k1=kmp(s,s1);
    k2=kmp(s1,s);//找出两个最长的前缀和后缀相同的长度
    if(k1>k2)
    {
      cout<<s<<s1+k1<<endl;
    }
    else if(k1<k2)
    {
      cout<<s1<<s+k2<<endl;
    }
    else
    {
      if(strcmp(s,s1)<0)//按字典顺序输出
        cout<<s<<s1+k1<<endl;
      else
        cout<<s1<<s+k2<<endl;
    }
  }
  return 0;
}



相关文章
|
10月前
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
9月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
243 0
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
436 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
321 0
|
算法
KMP算法
KMP算法
226 0
|
算法
KMP算法
KMP算法
157 0
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
人工智能 算法 BI
一篇文章讲明白KMP算法(俗称看毛片算法)
一篇文章讲明白KMP算法(俗称看毛片算法)
341 0
|
算法 Java
Java数据结构与算法:字符串匹配算法之KMP算法
Java数据结构与算法:字符串匹配算法之KMP算法