Java数据结构及算法实例:朴素字符匹配 Brute Force

 更新时间:2015年06月20日 11:02:03   投稿:junjie  
这篇文章主要介绍了Java数据结构及算法实例:朴素字符匹配 Brute Force,本文直接给出实例代码,代码中包含详细注释,需要的朋友可以参考下
/** 
 * 朴素字符串算法通过两层循环来寻找子串, 
 * 好像是一个包含模式的“模板”沿待查文本滑动。 
 * 算法的思想是:从主串S的第pos个字符起与模式串进行比较, 
 * 匹配不成功时,从主串S的第pos+1个字符重新与模式串进行比较。 
 * 如果主串S的长度是n,模式串长度是 m,那么Brute-Force的时间复杂度是o(m*n)。 
 * 最坏情况出现在模式串的子串频繁出现在主串S中。 
 * 虽然它的时间复杂度为o(m*n),但在一般情况下匹配时间为o(m+n), 
 * 因此在实际中它被大量使用。 
 * 该方法的优点是:算法简单明朗,便于实现记忆。 
 * 该方法的缺点是:进行了回溯,效率不高,而这些回溯都是没有必要的。 
 * 下面是该算法的Java代码,找到子串的话,返回子串在父串中第一次出现的位置, 
 * 找不到的话返回0. 
 */ 
package al; 
public class BruteForce { 
  public static void main(String[] args) { 
    String waitForMatch = "abbacbabcdabcbec"; 
    String pattern = "abcbe"; 
    BruteForce bruteForce = new BruteForce(); 
    int index = bruteForce.getSubStringIndex(waitForMatch, pattern); 
    System.out.println("Matched index is "+index); 
  } 
  /** 
   * @author 
   * @param waitForMatch 主字符串 
   * @param pattern 模式字符串 
   * @return 第一次字符串匹配成功的位置 
   */ 
  public int getSubStringIndex(String waitForMatch, String pattern){ 
    int stringLength = waitForMatch.length(); 
    int patternLength = pattern.length(); 
    // 从主串开始比较 
    for(int i=0; i<stringLength; i++) { 
      int k = i; // k指向主串下一个位置 
      for(int j=0; j<patternLength; j++) { 
        if(waitForMatch.charAt(k) != pattern.charAt(j)) { 
          break; 
        }else { 
          k++;// 指向主串下一个位置 
          if(j == patternLength-1) { 
            return i; 
          } 
        }           
      } 
    } 
    // 匹配不成功,返回0 
    return 0; 
  } 
} 

相关文章

  • Java返回分页结果集的封装代码实例

    Java返回分页结果集的封装代码实例

    这篇文章主要介绍了java返回分页结果集的封装代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • SpringBoot框架底层原理解析

    SpringBoot框架底层原理解析

    这篇文章主要介绍了SpringBoot底层原理,包括配置优先级的配置方式给大家讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是程序设计的精髓,程序设计的实质就是构造解决问题的算法,将其解释为计算机语言。
    2009-06-06
  • Java中Thread类基本用法详解

    Java中Thread类基本用法详解

    Java中的Thread类是用于创建和管理线程的类,Thread类提供了许多方法来管理线程,包括启动线程、中断线程、暂停线程等,下面这篇文章主要给大家介绍了关于Java中Thread类基本用法的相关资料,需要的朋友可以参考下
    2023-06-06
  • Java使用try-with-resources实现自动解锁

    Java使用try-with-resources实现自动解锁

    项目中使用Redission分布式锁,每次使用都需要显示的解锁,很麻烦,Java 提供了 try-with-resources 语法糖,它不仅可以用于自动关闭流资源,还可以用于实现自动解锁,本文将介绍如何利用 try-with-resources 实现锁的自动释放,需要的朋友可以参考下
    2025-01-01
  • Feign调用接口解决处理内部异常的问题

    Feign调用接口解决处理内部异常的问题

    这篇文章主要介绍了Feign调用接口解决处理内部异常的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • ocp开闭原则_动力节点Java学院整理

    ocp开闭原则_动力节点Java学院整理

    这篇文章主要为大家详细介绍了ocp开闭原则的相关资料,ocp开闭原则指导我们如何建立一个稳定的、灵活的系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • springboot2 jackson实现动态返回类字段方式

    springboot2 jackson实现动态返回类字段方式

    这篇文章主要介绍了springboot2 jackson实现动态返回类字段方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringBoot中操作Bean的生命周期的方法总结

    SpringBoot中操作Bean的生命周期的方法总结

    在SpringBoot应用中,管理和操作Bean的生命周期是一项关键的任务,这不仅涉及到如何创建和销毁Bean,还包括如何在应用的生命周期中对Bean进行精细控制,本文给大家总结了SpringBoot中操作Bean的生命周期的方法,需要的朋友可以参考下
    2023-12-12
  • Java中的 CyclicBarrier详解

    Java中的 CyclicBarrier详解

    这篇文章主要介绍了Java中的 CyclicBarrier详解,CyclicBarrier没有显示继承哪个父类或者实现哪个父接口, 所有AQS和重入锁不是通过继承实现的,而是通过组合实现的,下文相关内容需要的小伙伴可以参考一下
    2022-04-04

最新评论