回朔法/KMP算法-查找字符串
- 回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法。其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回true,或者源串查找完也没有找到返回false;这种方法简单粗暴,但思路清晰。又因为每次查找失败,源串需要回到起始位置的下一个位置开始查找,所以该算法也称为回朔法。
- KMP算法:先对要查找的字符串进行分析,找出其中重复的子字符串。然后将目标串与源串比较,一旦比较失败,则不用回朔,而是根据目标串子串的重复情况,直接调到重复子串的下一个位置。这样减少了大量的回朔,算法复杂度得意大量减小。
下面代码演示了回朔法和KMP算法,并作测试。
KMP算法查找:
package org.lyk.impl; public class KMP<T>
{
public boolean comtains(T[] source, T[] target) throws Exception
{
if(source == null || target == null)
{
throw new Exception("比较目标不能为空");
} int sourceLength = source.length;
int targetLength = target.length;
if(targetLength > sourceLength)
//目标串长达大于源串,肯定不存在,直接返回false
return false;
else if(targetLength == sourceLength)
{
//两个串长度相等,则挨个比较,若发现任何一个元素不相等,则直接返回false,若所有元素均相等个,则返回true
return this.compair(source, target);
}
else
{//源串长度大于目标串长度,用KMP算法比较 //分析目标串的重复情况,生成next数组
int[] next = this.getNext(target);
int currentSourceIndex = ;
int currentTargetIndex = ; //如果目标串没有到末尾,则继续循环,如果已经到目标串末尾,则说明找到
while(currentTargetIndex < targetLength)
{
//如果源串下标越界,说明查找结束,乜没有找到结果,返回false
if(currentSourceIndex >= sourceLength)
return false; if(source[currentSourceIndex].equals(target[currentTargetIndex]))
{
//两个元素相等,目标串和源串下标向后各移动一位
currentSourceIndex++;
currentTargetIndex++;
}
else
{ //目标串的第一个元素就与源串不相等,则源串向后移动一个位置继续比较
if(currentTargetIndex == )
{
currentSourceIndex++;
} currentTargetIndex = next[currentTargetIndex];
}
}
return true;
}
} private int[] getNext(T[] target)
{
int[] next = new int[target.length];
if(next.length > )
{
for(int i = ; i<target.length; i++)
{
int count = ;
for(int j = ;j < i-; j++)
{
boolean flag = true;
for(int k = ; k <= j; k++)
{
if(target[k] != target[i--j+k])
{
flag = false;
break;
}
}
if(flag == true)
{
count = j+;
}
}
next[i] = count;
}
}
return next;
} private boolean compair(T[] source, T[]target)
{
for(int i = ; i < source.length; i++)
{
if(!source[i].equals(target))
return false;
}
return true;
}
}
回朔法(暴力比较)查找字符串:
public static boolean strContain_BF(String _source, String _target)
{
boolean retVal = false;
if (null == _source || null == _target || "".equals(_source) || "".equals(_target))
return false;
char[] source = _source.toCharArray();
char[] target = _target.toCharArray();
int sourceLength = source.length;
int targetLength = target.length;
if (targetLength > sourceLength)
return false;
else if (targetLength == sourceLength)
{
for (int i = ; i < sourceLength; i++)
{
if (source[i] != target[i])
return false;
}
return true;
} else
{
for (int i = ; i <= sourceLength - targetLength; i++)
{
boolean flag = true;
for (int j = ; j < targetLength; j++)
{
if (target[j] != source[i + j])
{
flag = false;
break;
}
}
if (flag == true)
return true;
}
return false;
}
}
回朔法/KMP算法-查找字符串的更多相关文章
- KMP算法查找字符串
假设长字符串为t,短字符串为p.为了进行KMP匹配,首先需要计算字符串p的next数组,后面实现了计算该数组的函数void KmpGenNext(char* p, int* next).对于”abca ...
- 数据结构与算法--KMP算法查找子字符串
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...
- 【剑指offer12】矩阵中的路径(回朔法),C++实现
1.题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 基于KMP算法的字符串模式匹配问题
基于KMP算法的字符匹配问题 反正整个清明都在纠结这玩意...差点我以为下个清明要给自己过了. 至于大体的理解,我就不再多说了(还要画图多麻烦鸭),我参考了以下两个博客,写的真的不错,我放了超链接,点 ...
- 51NOD 1292 1277(KMP算法,字符串中的有限状态自动机)
在前两天的CCPC网络赛中...被一发KMP题卡了住了...遂决定,哪里跌倒就在哪里爬起来...把个KMP恶补一发,连带着把AC自动机什么的也整上. 首先,介绍设定:KMP算法计划解决的基本问题是,两 ...
- KMP算法 (字符串的匹配)
视频参考 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O(m*n),而如果用KMP算法,复杂度将会减少线型时间O(m+n). 设主串为ptr="ababaaababaa ...
- KMP算法在字符串中的应用
KMP算法是处理字符串匹配的一种高效算法 它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配.从渐进的意义上说,这样时间复杂度已经是最好的了,需要O(m+n)时间.对KMP的学习可以 ...
- 字符串匹配算法之————KMP算法
上一篇中讲到暴力法字符串匹配算法,但是暴力法明显存在这样一个问题:一次只移动一个字符.但实际上,针对不同的匹配情况,每次移动的间隔可以更大,没有必要每次只是移动一位: 关于KMP算法的描述,推荐一篇博 ...
- 字符串匹配的KMP算法详解及C#实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
随机推荐
- [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】
/*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...
- Nancy 简单学习
1. 环境 vs2010 , nancy 2. 需要测试的功能 1. 输出 页面输出简单文本 2. 输出json 数据 3. 操作 1. 创建asp.net 空项目 2. 添加引用Nancy库 使用n ...
- selenium+python自动化之登录案例
一.登录 1.先打开浏览器 2.打开论坛主页:http://www.hordehome.com/ 3.查找元素之前可以先设置元素等待:implicitly_wait() 4.点登录按钮,弹出登录框 5 ...
- Hibernate常用配置文件详解
本文转载自:http://blog.csdn.net/csh624366188/article/details/7578939 初学hibernate的童鞋,刚开应该都有这种感觉,hibernate的 ...
- 查看SQL执行计划
一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call count cpu elapsed disk ...
- Jenkins: 基础篇(环境配置)
自动化领域比较有影响力的开源框架jenkins,确实比较强大,易用.很多公司将其用来做持续即成CI(continuous integration).为了拓展和强化自己的软件设计生态系统,也将很久前使用 ...
- 【shell】 for循环
#!/bin/bash for i in 1,3,4,6 ##有几个数就循环几次 do echo $i done for m in $( cat /root/num.log) ## /root/num ...
- 百度地图和js操作iframe
document.getElementById("ifarme-63").contentWindow.document.getElementById("qksv" ...
- 【Java安装】Centos6.8 安装Java1.6
安装java 1.6 Centos6.8安装完成后,一般都安装了java,为了安装java1.6,需要卸载系统自带的java,主要步骤: 先安装java1.6,目的:为了防止先卸载系统自带java时, ...
- Nexus私服使Maven更加强大
前边简单介绍了Maven,而Maven默认提供的中央仓库是在远程网络服务Appache提供的,这对于我们开发时不合理的.如果我们没网了或者什么情况,我们怎么办?也就是说我们队中央仓库的依赖性太大.而N ...