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`语句中的不同分支。 #### 解决方案 虽然这种方法可以工作,但并不是最直观或最简洁的方式来处理字符串。自Java 7起,Java支持在`switch`...
### Java字符串查找和提取异常处理 #### 概述 本文将详细介绍如何在Java中实现字符串查找与提取功能,并在此过程中妥善处理可能出现的各种异常情况。通过分析提供的代码示例`IndexOfAndCharAt.java`,我们将了解到...
在本项目中,我们将利用其串行通信接口(UART)接收来自外部设备(如PC或移动设备)的字符串命令,并对这些命令进行解析,进而控制LED灯的亮灭。 串口通信(UART)是单片机与外部设备通信的一种简单且常用的方式,...
通过对模式字符串进行预处理并利用特定的移动策略,它能够在很多情况下优于Boyer-Moore算法和其他经典算法。在实际应用中,Sunday算法尤其适用于英语文本的搜索任务,并且由于其实现相对简单,因此被广泛采用。
函数通过一个`switch`语句处理这种情况,根据剩余字节数的多少进行适当的位操作和填充,以确保生成的Base64字符串是完整的。 5. 最后,函数返回生成的Base64字符串,这个字符串可以直接插入到HTML的`<img>`标签的`...
- `findstr`:在长字符串中查找短字符串的所有出现位置。 - `strfind`:类似`findstr`,但在字符串中查找特定子串的位置。 元胞数组常用于存储多个字符串,因为每个元胞可以存储任意类型的数据。例如: ```matlab ...
5. **内部运算和处理**:在输出字符串的同时,我们可以进行内部运算,比如查找特定字符、替换字符、拼接字符串等。例如,可以用`std::replace`函数替换字符串中的特定字符,或用`str.find("substring")`查找子字符串...
本资料包"archive_日期,菜单,字符串的C函数 .zip.zip"似乎包含了与C语言相关的函数知识,特别是涉及到菜单设计和字符串操作的部分。下面我们将深入探讨这些关键知识点。 首先,C语言中的菜单设计通常通过字符输入...
字符串类提供了许多常用的方法,如`length()`返回字符串的长度,`charAt(int index)`获取指定索引处的字符,`substring(int beginIndex)`截取从指定位置开始的子字符串,以及`indexOf(String str)`查找子字符串在原...
本题目的核心是利用双指针来反转字符串中的元音字母,这是一种独特而有趣的算法挑战。元音字母通常指的是"a"、"e"、"i"、"o"、"u"(不分大小写)。 首先,我们需要理解字符串的基本概念。在C语言中,字符串是以空...
这通过比较文章中的每个节点的数据与用户输入的字符串来完成。当找到匹配的子串时,计数器增加。`Count1()`函数负责执行这个任务。 3. **字串删除模块**: 用户可以指定要删除的子串,程序会将其从文章中移除,并...
5. **优化与性能**:`switch`语句通常比一系列的`if...else if...else`语句运行得更快,因为编译器能够对`switch`进行优化,创建一个查找表来提高执行速度。 6. **异常处理**:在`switch`结构中,错误的`case`标签...
5. **字符串中查找子字符串程序设计**:编写程序实现字符串匹配功能,能够在给定的文本中查找特定的子串。 #### 实验硬件、软件环境 实验所使用的硬件环境是一台配置为CPU为P4 2.8G、内存为512M、硬盘为80G的PC...
Swift还提供了丰富的字符串操作,如访问特定字符、查找子串、替换子串等。例如: ```swift let index = str.firstIndex(of: "2.2") // 查找子串位置 let substring = str[index...index.advanced(by: 3)] // 提取...
8. **字符串处理**:Java中的字符串是不可变对象,常用的方法包括获取长度、比较、拼接、查找子串等。字符串与基本数据类型之间可以相互转换,如使用`Integer.parseInt()`和`String.valueOf()`。 9. **引用数据类型...
这段代码检查了单词的边界条件,然后使用嵌套循环进行字符串的逐字符比较,一旦找到匹配的单词,就增加计数。 4. **用户界面**:为了使程序用户友好,可以设计一个简单的命令行菜单,包括"生成文件"、"输入单词并...
7. **字符串查找与计数**: 实现字符串计数时,需要遍历链表,遇到特定字符(如数字、标点符号)时,相应计数器加一。在输出时,还需要对特殊字符(如空格和换行)进行处理,比如将空格替换为':',换行替换为'\\',...
实现时需要遍历字符串并查找目标子串,然后进行替换。 6. **判断相等(StrCompare)**: 判断两个字符串是否相等,如"B 串标识1 串标识2 回车",返回值可以是整数,用于表示字符串的大小关系。在C++中,可以使用`...
C语言函数库是其核心组成部分,提供了大量的预定义函数,使得开发者能够方便地进行输入输出、数学运算、字符串处理等操作。"C语言函数库查找.chm"是一个专门针对C语言函数的参考手册,特别适合初学者快速查询和学习...
在准备面试时,除了熟悉这些基础知识外,还要关注实际应用,例如如何在实际项目中安全地处理字符串,以及如何优化字符串操作的性能。同时,对算法和数据结构的深入理解,以及良好的问题解决能力,都是面试中不可或缺...