`

使用看毛片算法完成字符串匹配-0-

 
阅读更多
简介:
KMP 算法,俗称“看毛片”算法,是字符串匹配的一个算法.

代码示例:


import java.util.ArrayList;

public class KMP {
 //主串
 static String str = "1kk23789456789hahha";
 //模式串
 static String ch = "789";
 static int next[] = new int[20];

 public static void main(String[] args) {

  setNext();

  ArrayList<Integer> arr = getKmp();

  if(arr.size()!=0) {
   for(int i=0; i<arr.size(); i++) {
    System.out.println("匹配发生在:"+arr.get(i));
   }
  }else {
   System.out.println("匹配不成功");
  }
 }


 private static void setNext() {
  // TODO Auto-generated method stub
  int lenCh = ch.length();
  next[0] = 0;
  next[1] = 1;
  //k表示next[i-1]的值
  int k = 0;
  for(int i=2; i<=lenCh; i++) {
   k = next[k];
   /*
    * 这个while循环的作用找个例子看看就好理解了
    * 我认为是每次找最长,一旦成功就停止,保证找到的是当前最长
    */
   while(k!=0 && ch.charAt(i-1)!=ch.charAt(k)) {
    k = next[k];
   }
   if(ch.charAt(i-1)==ch.charAt(k)) {
    k++;
   }//else就是k=0
   //不是next[k] = k,i表示有几个字符的前缀
   next[i] = k;
  }
 }
 private static ArrayList<Integer> getKmp() {
  // TODO Auto-generated method stub
  ArrayList<Integer> arr = new ArrayList<Integer>();
  int lenStr = str.length();
  int lenCh = ch.length();
  //主串开始的匹配位置
  int pos = 0;
  //模式串每次匹配位置
  int k = 0;
  //循环条件不是k<lenCh,这样的话可能死循环(没有匹配发生)
  while(pos<lenStr) {
   /*
    * 首次进入没什么大作用,做要是为提高以后的匹配效率
    * 写在最后一行也行
    */
   k = next[k];
   while(k<lenCh && str.charAt(pos)==ch.charAt(k)) {
    pos++;
    k++;
   }
   if(lenCh==k) {
    arr.add(pos-k);
   }else if(0==k) {
    /*
     * 不加这一句死循环
     * 因为next[0] = 0
     * 比如abcd和abce,到de不匹配,此时执行k = next[k](k=3),
     * k变为0,发现d和a不匹配,此时k还是0,重复执行以上步骤,那么死循环了
     */
    pos++;
   }//实际上else就是k = next[k],所以才说k = next[k]写在最后一行也行
  }
  return arr;
 }

}
分享到:
评论

相关推荐

    《字符串模式匹配KMP算法》教学课例设计[归纳].pdf

    《字符串模式匹配KMP算法》教学课例设计 在这篇教学设计中,我们旨在帮助学生掌握KMP字符串模式匹配算法的基本概念和应用。通过本课例设计,学生将了解KMP算法的应用普遍性、实现机制和时间复杂度,并掌握计算next...

    Algorithms and Theory of Computation Handbook|算法和计算理论手册

    包含在字符串匹配,数据结构和有限的精密上的广泛的讨论。 提供彻底的B树的报告。 集中于实际的算法,即使他们不渐近最佳。 略述算法的技术具有关键的重要性的具体的申请 算法和计算理论手册是一次也包括很多理论...

    asp.net技术内幕(1)

    &lt;br&gt;17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...

    asp.net技术内幕(2)

    &lt;br&gt;17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...

    asp.net技术内幕(5)

    &lt;br&gt;17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...

    asp.net技术内幕(4)

    &lt;br&gt;17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...

    asp.net技术内幕(3)

    &lt;br&gt;17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...

    期末刷题2020数据结构习题集答案ans.pdf

    1. 串:串是字符的有限序列,空串是没有任何字符的串,而不是由空格构成的串。模式匹配是串的一种重要运算,串既可以采用顺序存储,也可以采用链式存储。 2. 图:设无向图的顶点个数为n,则该图最多有n(n-1)/2条边...

    ASP.net技术内幕

    17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用页面分段缓存 17.2.1 按参数改变页面分段缓存 ...

    從新手到高手C++全方位學習

    18.3 字符串的使用 18.3.1 swap() 交換兩個字符串的內容 18.3.2 將string型字符串轉為char型字符串 18.3.3 char型字符串與函數 18.3.4 函數如何返回字符串 18.4 結構體 18.4.1 結構體的賦值 18.4.2 結構體與函數 ...

    winrar3.7 Beta8

    WinRAR 设置可以在注册表键 HKEY_CURRENT_USER\Software\WinRAR\Paths 中设置字符 串值 "AppData" 来覆盖默认的 %appdata%\WinRAR 路径。 &lt;br&gt; 例如,如果要保存主题文件到 WinRAR 文件夹中,设置 "c:\...

    JAVA程序设计教程

    1.1.1 算法.................................................................................................................2 1.1.2 实体.................................................................

Global site tag (gtag.js) - Google Analytics