`

使用看毛片算法完成字符串匹配-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...

    编程算法练习--没事的时候练练

    #### 知识点九:字符串匹配 - **描述**:在一串字符串中查找特定的子串“6”并统计出现次数。 - **实现思路**: - 使用字符串搜索函数(如`indexOf`或`find`)来查找子串的位置。 - 如果找到,则累加计数器,并...

    轻松入门MATLAB:MATLAB深入学习字符串.zip

    4. **字符串索引与分片** 在MATLAB中,字符串可以像数组一样被索引,如`s(1)`获取第一个字符,`s(2:end)`获取从第二个字符到结尾的所有字符。 5. **字符串分割** `strsplit`函数用于根据指定分隔符将字符串分割成...

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

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

    【数据结构与算法】课程设计.zip

    1. **串数**:串数,即字符串,是编程中常见的一种数据结构,由一串字符组成。处理串数涉及到的操作包括查找、替换、插入、删除等。在实际应用中,如文本处理、搜索引擎、生物信息学等领域都有广泛应用。在课程设计...

    2021-2022计算机二级等级考试试题及答案No.15008.docx

    - C: `Like "*计算机*" `—— 使用LIKE子句和通配符(*)匹配任意包含“计算机”的字符串。 - D: `Like "计算机"` —— 只能匹配恰好为“计算机”的字符串。 - **正确答案**:C #### 题目5:剪贴板操作 - **题目...

    2021-2022计算机二级等级考试试题及答案No.16140.docx

    - **应用场景**: 用于字符串匹配。 - **重要性**: 掌握这种表达式的评估规则有助于编写更复杂的逻辑判断。 ### 19. Visual FoxPro中的数据类型 - **知识点**: 在Visual FoxPro中,常见的数据类型包括日期型(D)、...

    2021-2022计算机二级等级考试试题及答案No.14667.docx

    - **知识点解析**:字符串长度包括实际字符加上一个结束符'\0',故长度为6。 #### 7. EXCEL的工作簿概念 - **题目描述**:EXCEL通过工作簿组织和管理数据。 - **知识点解析**:Excel使用工作簿来组织和管理数据,...

    简要数据结构讲义--配合严蔚敏c版数据结构使用

    - **定义**:由n(n≥0)个元素a1, a2, …, an组成的有限序列。 - **特点**:每个元素最多只有一个前驱和一个后继;除了第一个和最后一个元素外,其他每个元素都有一个且仅有一个前驱和一个后继。 ##### 2. 顺序表...

    后缀数组的一些资料

    "后缀数组——处理字符串的有力工具.ppt"可能是教学演示文稿,通过幻灯片形式展示关键概念和算法流程。而"后缀数组模板.txt"可能包含了一些实践中的代码模板,便于读者直接使用或参考实现后缀数组的相关功能。 总之...

    c51实现单片机的中文输入法

    - **拼音字符串处理**:输入的拼音字符串可能包含多个拼音,需要通过分词算法将其分割成单个拼音。 - **拼音识别与匹配**:对于每个分割出的拼音,需要查找相应的映射表,确定对应的中文字符或字符集合。 - **字符...

    2021-2022计算机二级等级考试试题及答案No.13350.docx

    - 获取字符串的最后一个字符可以通过访问字符串长度减一的位置来实现。例如,在某些编程语言中,如果字符串名为`s`,则`s.Length - 1`表示最后一个字符的位置。 #### 9. 数据集填充机制 - `SqlDataAdapter`对象是...

    觅职渣记-互联网技术类笔试面试总结

    正则表达式是一种用于匹配字符串中字符组合的强大工具。它可以用来搜索、替换或提取文本中的模式。 **10. 内存操作** - **malloc()**:动态分配内存。 - **free()**:释放由`malloc()`分配的内存。 - **calloc()**...

    2012创新工场校园招聘笔试题

    【创新工场校园招聘笔试题】是一份针对应聘者能力测试的题目集,涉及的知识点广泛,涵盖了计算机科学的基础知识,如面向对象编程、操作系统、数据结构与算法、字符串匹配和网络等多个方面。以下是这些题目所涵盖的...

    2021-2022计算机二级等级考试试题及答案No.18466.docx

    - **len函数**:在Python中,获取字符串长度应使用内置函数`len()`,而不是`str.len()`。 #### 21. 事件监听器机制 - **题目解析**:此题考查事件监听器机制。 - **知识点详解**: - **监听器注册**:一个控件...

    我的题库2006-2007

    - **方法**:可以通过简单的字符串长度函数来实现,例如`strlen`,它在编译时就可以确定字符串常量的长度。 #### 17. STL map的使用 - **示例**: - `std::map, int&gt; map_;` - `map_[1] = 2;` - `int a = map_...

    PHP架构师 指南 设计

    - `__toString()`: 当对象被当作字符串使用时调用。 - `__get()`: 当试图获取一个不存在或者不可见的成员变量时调用。 - `__set()`: 当试图给对象设置一个不存在或者不可见的成员变量时调用。 - `__call()`: 当试图...

    2021-2022计算机二级等级考试试题及答案No.10097.docx

    - **详细说明**:要实现首字母大写的效果,可以使用字符串切片结合字符串方法。因此,选项A“print(str[0].upper()+str[1:])”是正确的实现方式。 通过以上总结,我们可以看到,这些知识点覆盖了数据库、编程语言、...

    2021-2022计算机二级等级考试试题及答案No.11992.docx

    - **应用场景**:在处理字符串数据时,正确使用字符串比较方法可以避免逻辑错误。 #### 25. Word中的表格操作 - **知识点**:Word中可通过拖动标尺上的“移动表格列”调整表格列宽(选项正确)。 - **应用场景**:...

    北邮2016年计算机学科基础综合803考研真题参考答案

    题目考查的是KMP算法,这是一种高效的字符串匹配算法。 **答案解析:** 选项A正确。KMP算法的核心在于构造一个部分匹配表(next数组),用于当主串和模式串的部分匹配失败时,避免不必要的回溯。题目中的例子说明了...

Global site tag (gtag.js) - Google Analytics