概要

KMP字符串查找(匹配)算法,我相信多数人都已经了解了,这里不在赘述。我只是提几个关键点,然后讲一下WINX中的KMP字符串查找算法的用法。

字符串匹配算法,输入有两个: 一个是模式串(pattern),一个目标文本。模式串比较小,通常std::string(或std::wstring就可以了)。而目标文本通常比较大,在多数实用的情形下,会是一个磁盘文本文件;或者内存中逻辑上的文本流,但实际上不是简单的字符串(不连续)。

KMP字符串查找(匹配)算法最大的好处,并不是它比strstr快,而是它不回溯。这是很奇妙的一个特征。这意味着目标文本只需要提供一个取得下一个字符的函数(在WINX中,这个函数叫get),就可以实现搜索。这对KMP算法的客户而言,无疑是非常有利的一件事情。

WINX的KMP字符串查找(匹配)算法总体来说用法很简单,唯一需要注意的是,和一般的匹配算法不同,WINX匹配成功后,目标文本中当前位置(position)指向的是被匹配串的末尾,而不是开始。例如,C库的strstr("1234abcdefg", "abc"),返回的结果是指向"abcdefg"中的'a'。而WINX的KMP算法返回的是"defg"中的'd'。

样例

我们这里给几个样例(这里假设以大小写敏感,如果要大小写不敏感,只需要换成把Finder类换成NoCaseFinder类)。

1、在文件(WINX的Archive流)中查找

    void testSearchInArchive(LogT& log)
    {
        std::string line;
        std::StdioReadArchive ar(__FILE__);

std::kmp::Finder<char> finder("std::kmp::Finder<char>");
        HRESULT hr = finder.next(ar);
        AssertExp(hr == S_OK);

ar.getline(line);
        log.trace(" line =%s ", line.c_str());
    }

请问,这个函数执行输出什么?

2、在文件(C++标准流)中查找

    void testSearchInFStream(LogT& log)
    {
        std::string line;
        std::ifstream is(__FILE__);
        
        std::kmp::Finder<char> finder("std::ifstream");
        HRESULT hr = finder.istreamNext(is);
        AssertExp(hr == S_OK);

std::getline(is, line);
        log.trace(" line =%s ", line.c_str());        
    }

3、在C风格的字符串中查找

    void testSearchInCStr(LogT& log)
    {
        const char* p;
        const char dest[] = "1234ababcde";
        
        std::kmp::Finder<char> finder("abc");
        HRESULT hr = finder.cstrNext(dest, &p);
        AssertExp(hr == S_OK);
        AssertExp(strcmp(p, "de") == 0);
    }

可以看到,finder.cstrNext返回p是指向"de",而不是"abcde"。

要让它指向"abcde",很简单,只需要执行:
   
p -= finder.size();

这里finder.size()返回的是模式串(pattern)的大小。

4、在STL的容器(如deque)中查找

    void testSearchInDeque(LogT& log)
    {
        typedef std::deque<char> Container;

const char destBuf[] = "1234ababcde";
        Container::iterator itFind;
        Container dest(sizeof(destBuf));
        std::copy(destBuf, destBuf+sizeof(destBuf), dest.begin());

std::kmp::Finder<char> finder("abc");
        HRESULT hr = finder.iteratorNext(dest.begin(), dest.size(), &itFind);
        AssertExp(hr == S_OK);
        AssertExp(dest.end() - itFind == 3);
    }

附录

  1. 完整的KMP字符串查找(匹配)算法的源代码,请参考这里:

    WINX之KMP字符串查找算法源码

  2. 对WINX感兴趣?下载WINX开发包。
  3. 本文对应英文版本是:KMP String Searching Algorithm in WINX。欢迎指出翻译不到位的地方(实在是硬着头皮上了)。
  4. winx-1.1.02还加了哪些?更详细的内容参考这里。

转载于:https://www.cnblogs.com/wuwuwu/archive/2006/12/03/6162472.html

WINX新增(1): KMP字符串查找算法相关推荐

  1. kmp字符串查询算法

    kmp字符串查询算法 1 普通的字符串查询 普通的字符串查询是遍历被查找的字符串,然后和key字符串进行匹配,如果不一致,则,被查找的字符串+1,继续向下遍历. 代码如下: private stati ...

  2. 暴力子字符串查找算法

    暴力子字符串查找算法的名字虽然很霸气,但是效率不是很高.是一种简单.粗暴的查找方式. 在最坏的情况下,暴力子字符串查找算法在长度为N的文本中查找长度为M的模式需要~NM次字符比较. 核心思想:就是对主 ...

  3. Rabin-Karp 指纹字符串查找算法

    Rabin-Karp 指纹字符串查找算法 M.O.Rabin 和 R.A.Karp 发明了一种完全不同的基于散列的字符串查找算法.我们需要计算模式字符串的散列函数,然后用相同的散列函数计算文本中所有可 ...

  4. 字符串查找算法BF、KMP详解

    字符串查找: BF算法: (朴素查找算法) 当查找不成功时,主串返回刚刚起始字符的下一个,子串返回第一个字符位置 时间复杂度:O(n*m) int BF(const char* str, const ...

  5. KMP(Knuth-Morris-Pratt) 字符串查找算法

    1.背景   我接触到这个算法是在力扣的每日一题中(28. 实现 strStr()),这本来只是一个分类为简单的题目.但是却在官方题解中介绍了这个看似十分复杂的算法.   在官方题解中给出了详细的证明 ...

  6. Rabin-Karp字符串查找算法学习:poj1200

    本来准备学习Hash的,结果看PPT讲的第一个算法竟然是跟字符串处理相关的,本来Hash中也有一块专门讲字符串Hash的,就按照<算法导论>中的分类,把这个分到"字符串处理&qu ...

  7. KMP- Knuth-Morris-Pratt 字符串查找算法

    2019独角兽企业重金招聘Python工程师标准>>> TBD 转载于:https://my.oschina.net/u/1041012/blog/954965

  8. KMP —— 字符串分析算法

    同学们好,我是来自 <技术银河>的

  9. 字符串之子字符串查找

    子字符串查找   字符串的一种基本操作就是子字符串查找:给定一段长度为N的文本text和一个长度为M的模式字符串pattern,在文本中找到一个和该模式相符的子字符串.解决该问题的大部分算法都可以很容 ...

  10. 【字符串】字符串查找 ( Rabin-Karp 算法 )

    文章目录 一.字符串查找 二.Rabin-Karp 算法 一.字符串查找 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串 中查找 另外一个字 ...

最新文章

  1. 日期和时间规范函数 (Entity SQL)
  2. 说实话,你的API接口在高并发面前不堪一击!
  3. iOS8 用AVAudioPlayer播放音乐(Swift)
  4. a as as big rat_超好玩!12句英语绕口令,你能一口气读完几句?
  5. 解决AutoCAD2010安装完毕后闪退问题
  6. 2021年宁夏省高考成绩查询入口,2021年宁夏高考成绩查询通知【附官网查询入口】...
  7. 3d激光雷达开发(旋转和位移)
  8. 极小曲面壳体的静力学分析(ABAQUS)
  9. modelica练习
  10. 前端学习之路Electron——全局注册、注销快捷键
  11. 计算机考研复试面试题专业知识整理
  12. 手机中的com.android.provision删除可不可以,Android Provision (Setup Wizard)
  13. python查看哪些内存被释放_python内存不释放原理 | shell's home
  14. 金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享
  15. Android8.0通知栏适配全面解析
  16. 加州洛杉矶计算机研究生,加州洛杉矶计算机硕士文书要求
  17. 一些生活中常用的英语单词
  18. linux多重引导工具,Linux多重引导器
  19. 站长们如何优化自已的新网站
  20. 第九届“中国软件杯”大学生软件设计大赛总决赛落幕

热门文章

  1. IT公司是怎样面试的? (转载)
  2. iMazing2注册机如何备份苹果手机的通话记录?
  3. Ubuntu 12.04 MTK环境配置说明
  4. Java 8 中的这个接口真好用!炸了!
  5. Java 对象不使用时,为什么要赋值为 null?
  6. 厉害!某生鲜电商平台竟然是这样设计监控模块的(已开源)~
  7. 副业接私活必备的 10 个开源项目!
  8. Anroid性能优化系列——Improving Layout Performance(二)
  9. 【干货】阿里直播平台的架构演进
  10. sift计算效率优化_【计算机视觉】9. 小结