`
sunzongbao2007
  • 浏览: 1899 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

字符串蛮力查找利用switch与查找表进行优化

阅读更多

import java.util.Vector;
import java.util.Date;
class BreuteSearch{
 static int[] lookup=new int[256];

//蛮力查找
 public static Vector<Integer> brute0(String text,String str){
  
  Vector<Integer> result =new Vector<Integer>(); 
  for(int i=0;i<text.length();i++){
    int flag=0;
    for(int j=0;j<str.length();j++){
     
     if(text.charAt(i+j)!=str.charAt(j)){
      break;
     }else{
      flag++;
     } 

     if(flag==str.length()){
      result.add(i);
      
     } 
   
    }

    flag=0;  

  }

  return result;  

 }

 

//蛮力查找优化版lookup查找表
 public static Vector<Integer> brute1(String text,String str){
  
  Vector<Integer> result=new Vector<Integer>();

  lookup[str.charAt(0)]=2;
  lookup[0]=1;
  
  for(int i=0;i<text.length();i++){
   switch(lookup[text.charAt(i)]){
    case 0:break;
    case 1:return null;
    case 2:
     int flag=0;
     for(int j=1;j<str.length();j++){
      if(text.charAt(i+j)!=str.charAt(j)){
       break;
      }else{
       flag++;
      }
      
      if(flag==str.length()-1){
       result.add(i);
      }
     }
    default:break;
   }
  }

  return result;

 }
 
 public static void main(String[] argv){

   String  text="sunzongbaoonhahahahahsunzongbaoons.....";//假设从文本中读出很长一段
   
    
   
   

   String str="ong";
   long time00=new Date().getTime();
   Vector<Integer> result0=brute0(text,str);
   long time01=new Date().getTime();

   long time10=new Date().getTime();
   Vector<Integer> result1=brute1(text,str);
   long time11=new Date().getTime();

      
   

    System.out.println("Time1:"+(time01-time00));
    System.out.println("Time2:"+(time11-time10));//明显第二种的效率高了很多
   
 }


}





虽然优化版本的能力比较好,但是遇见如aaaaaaaaaaaaaaaaaaa...ab中查找ac的话依然会陷入普通蛮力查找的漩涡,显然这种情况是最坏情况。



最坏 O(str.len*text.len);

典型 O(text.length);

准备时间 无

分享到:
评论

相关推荐

    switch不能字符串比较解决方法

    然后,它根据传入的字符串查找对应的整数值,并基于这些整数值执行`switch`语句中的不同分支。 #### 解决方案 虽然这种方法可以工作,但并不是最直观或最简洁的方式来处理字符串。自Java 7起,Java支持在`switch`...

    Java字符串查找和提取异常处理

    ### Java字符串查找和提取异常处理 #### 概述 本文将详细介绍如何在Java中实现字符串查找与提取功能,并在此过程中妥善处理可能出现的各种异常情况。通过分析提供的代码示例`IndexOfAndCharAt.java`,我们将了解到...

    单片机解析字符串命令示例

    在本项目中,我们将利用其串行通信接口(UART)接收来自外部设备(如PC或移动设备)的字符串命令,并对这些命令进行解析,进而控制LED灯的亮灭。 串口通信(UART)是单片机与外部设备通信的一种简单且常用的方式,...

    字符串匹配之Sunday算法(英文原版)

    通过对模式字符串进行预处理并利用特定的移动策略,它能够在很多情况下优于Boyer-Moore算法和其他经典算法。在实际应用中,Sunday算法尤其适用于英语文本的搜索任务,并且由于其实现相对简单,因此被广泛采用。

    基64字节数组转基64字符串

    函数通过一个`switch`语句处理这种情况,根据剩余字节数的多少进行适当的位操作和填充,以确保生成的Base64字符串是完整的。 5. 最后,函数返回生成的Base64字符串,这个字符串可以直接插入到HTML的`&lt;img&gt;`标签的`...

    【Matlab基础】字符串与结构语句.docx

    - `findstr`:在长字符串中查找短字符串的所有出现位置。 - `strfind`:类似`findstr`,但在字符串中查找特定子串的位置。 元胞数组常用于存储多个字符串,因为每个元胞可以存储任意类型的数据。例如: ```matlab ...

    c++_按顺序输出字符串_

    5. **内部运算和处理**:在输出字符串的同时,我们可以进行内部运算,比如查找特定字符、替换字符、拼接字符串等。例如,可以用`std::replace`函数替换字符串中的特定字符,或用`str.find("substring")`查找子字符串...

    archive_日期,菜单,字符串的C函数 .zip.zip

    本资料包"archive_日期,菜单,字符串的C函数 .zip.zip"似乎包含了与C语言相关的函数知识,特别是涉及到菜单设计和字符串操作的部分。下面我们将深入探讨这些关键知识点。 首先,C语言中的菜单设计通常通过字符输入...

    第8章 枚举,字符串和数组.ppt

    字符串类提供了许多常用的方法,如`length()`返回字符串的长度,`charAt(int index)`获取指定索引处的字符,`substring(int beginIndex)`截取从指定位置开始的子字符串,以及`indexOf(String str)`查找子字符串在原...

    c语言面试题之双指针反转字符串中的元音字母.zip

    本题目的核心是利用双指针来反转字符串中的元音字母,这是一种独特而有趣的算法挑战。元音字母通常指的是"a"、"e"、"i"、"o"、"u"(不分大小写)。 首先,我们需要理解字符串的基本概念。在C语言中,字符串是以空...

    数据结构-字符串-课程设计.doc

    这通过比较文章中的每个节点的数据与用户输入的字符串来完成。当找到匹配的子串时,计数器增加。`Count1()`函数负责执行这个任务。 3. **字串删除模块**: 用户可以指定要删除的子串,程序会将其从文章中移除,并...

    TestSwitch

    5. **优化与性能**:`switch`语句通常比一系列的`if...else if...else`语句运行得更快,因为编译器能够对`switch`进行优化,创建一个查找表来提高执行速度。 6. **异常处理**:在`switch`结构中,错误的`case`标签...

    java实验报告之数组及字符串应用

    5. **字符串中查找子字符串程序设计**:编写程序实现字符串匹配功能,能够在给定的文本中查找特定的子串。 #### 实验硬件、软件环境 实验所使用的硬件环境是一台配置为CPU为P4 2.8G、内存为512M、硬盘为80G的PC...

    swift2.2字符串&数组&集合

    Swift还提供了丰富的字符串操作,如访问特定字符、查找子串、替换子串等。例如: ```swift let index = str.firstIndex(of: "2.2") // 查找子串位置 let substring = str[index...index.advanced(by: 3)] // 提取...

    JAVA循环数组字符串PPT教案学习.pptx

    8. **字符串处理**:Java中的字符串是不可变对象,常用的方法包括获取长度、比较、拼接、查找子串等。字符串与基本数据类型之间可以相互转换,如使用`Integer.parseInt()`和`String.valueOf()`。 9. **引用数据类型...

    C语言课程设计文字查找

    这段代码检查了单词的边界条件,然后使用嵌套循环进行字符串的逐字符比较,一旦找到匹配的单词,就增加计数。 4. **用户界面**:为了使程序用户友好,可以设计一个简单的命令行菜单,包括"生成文件"、"输入单词并...

    数据结构实验报告三、串及其应用.docx

    7. **字符串查找与计数**: 实现字符串计数时,需要遍历链表,遇到特定字符(如数字、标点符号)时,相应计数器加一。在输出时,还需要对特殊字符(如空格和换行)进行处理,比如将空格替换为':',换行替换为'\\',...

    数据结构关于串操作的课程设计

    实现时需要遍历字符串并查找目标子串,然后进行替换。 6. **判断相等(StrCompare)**: 判断两个字符串是否相等,如"B 串标识1 串标识2 回车",返回值可以是整数,用于表示字符串的大小关系。在C++中,可以使用`...

    C语言函数库查找.chm

    C语言函数库是其核心组成部分,提供了大量的预定义函数,使得开发者能够方便地进行输入输出、数学运算、字符串处理等操作。"C语言函数库查找.chm"是一个专门针对C语言函数的参考手册,特别适合初学者快速查询和学习...

    面试问题整理汇总

    在准备面试时,除了熟悉这些基础知识外,还要关注实际应用,例如如何在实际项目中安全地处理字符串,以及如何优化字符串操作的性能。同时,对算法和数据结构的深入理解,以及良好的问题解决能力,都是面试中不可或缺...

Global site tag (gtag.js) - Google Analytics