1. 回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法。其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回true,或者源串查找完也没有找到返回false;这种方法简单粗暴,但思路清晰。又因为每次查找失败,源串需要回到起始位置的下一个位置开始查找,所以该算法也称为回朔法。
  2. 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算法-查找字符串的更多相关文章

  1. KMP算法查找字符串

    假设长字符串为t,短字符串为p.为了进行KMP匹配,首先需要计算字符串p的next数组,后面实现了计算该数组的函数void KmpGenNext(char* p, int* next).对于”abca ...

  2. 数据结构与算法--KMP算法查找子字符串

    数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...

  3. 【剑指offer12】矩阵中的路径(回朔法),C++实现

    1.题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...

  4. 基于KMP算法的字符串模式匹配问题

    基于KMP算法的字符匹配问题 反正整个清明都在纠结这玩意...差点我以为下个清明要给自己过了. 至于大体的理解,我就不再多说了(还要画图多麻烦鸭),我参考了以下两个博客,写的真的不错,我放了超链接,点 ...

  5. 51NOD 1292 1277(KMP算法,字符串中的有限状态自动机)

    在前两天的CCPC网络赛中...被一发KMP题卡了住了...遂决定,哪里跌倒就在哪里爬起来...把个KMP恶补一发,连带着把AC自动机什么的也整上. 首先,介绍设定:KMP算法计划解决的基本问题是,两 ...

  6. KMP算法 (字符串的匹配)

    视频参考 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O(m*n),而如果用KMP算法,复杂度将会减少线型时间O(m+n). 设主串为ptr="ababaaababaa ...

  7. KMP算法在字符串中的应用

    KMP算法是处理字符串匹配的一种高效算法 它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配.从渐进的意义上说,这样时间复杂度已经是最好的了,需要O(m+n)时间.对KMP的学习可以 ...

  8. 字符串匹配算法之————KMP算法

    上一篇中讲到暴力法字符串匹配算法,但是暴力法明显存在这样一个问题:一次只移动一个字符.但实际上,针对不同的匹配情况,每次移动的间隔可以更大,没有必要每次只是移动一位: 关于KMP算法的描述,推荐一篇博 ...

  9. 字符串匹配的KMP算法详解及C#实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

随机推荐

  1. ABBYY把pdf转换成word的方法

    有时候我们在网上下载的资料文献是PDF格式文档,遇到喜欢的字句总忍不住想要收藏起来,但是PDF文档不同于普通的Word文档可以直接进行复制粘贴,需要下载安装相关的编辑工具,才能对文字内容进行编辑.倒不 ...

  2. 怎么给OCR文字识别软件重编文档页面号码

    ABBYY FineReader Pro for Mac OCR文字识别软件处理文档时,在FineReader文档中,页面的加载顺序即是页面的导入顺序,完成导入之后,文档的所有页面均会被编号,各编号会 ...

  3. php-mysql-excel

    <?php $fname = $_FILES['MyFile']['name']; $do = copy($_FILES['MyFile']['tmp_name'],$fname); if ($ ...

  4. jQuery Mobile_表单元素

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. C# 使用ffmpeg.exe进行音频转换完整demo

    今天在处理微信的开发接口时候,发现微信多媒体上传接口中返回的音频格式是amr.坑人的是现在大部分的web 播放器,不支持amr的格式播放.试了很多方法都不行. 没办法,只要找一个妥协的解决方案:将am ...

  6. RMAN备份与恢复之数据文件

    备份数据文件,模拟磁盘损坏时,还原恢复数据文件. 首先,查询数据文件序号,备份数据文件,可根据数据文件序号指定备份的数据文件. SQL SQL> select file_name,file_id ...

  7. Android Bitmap和Canvas学习笔记 [转]

    原文:http://www.cnblogs.com/feisky/archive/2010/01/10/1643460.html 位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的. ...

  8. 多线程编程之Linux环境下的多线程(一)

    一.Linux环境下的线程 相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型.Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程 ...

  9. 真实赛车3,SPEEDRUSH TV 第3季,第3阶段(第3天),直线加速赛

    与其跳过,不如金币升级引擎和车身.因为后边紧跟一场计时赛.

  10. 关于windows下c/c++的rand()的一个测试

    ,,,}; ,-,,}; ,y=; ;t<<<;t++){ ; x+=xs[d];y+=ys[d]; 在(x,y)绘制一个点; } 根据rand()%4的值决定点的移动方向,生成图像 ...