字符串常见算法之一:查找一个短串在一个长串中位置
2010-10-09 14:00
204 查看
字符串常见算法之一:查找一个短串在一个长串中位置 http://www.cppblog.com/humanchao/archive/2009/11/25/101918.aspx 介绍的一些字符串处理的问题在日常编程中比较常见,但是在大学读书的时候几乎一个都没有涉及,最近学习了一下在这里介绍给大家,仅供参考。
这些算法与内容包括:
1、 查找一个短串在一个长串中位置;
2、 查找一个字符串中最长的重复子串;
3、 查找一个字符串中重复最多的子串;
4、 两个字符串最长的公共子串(连续);
5、 两个字符串最长的公共子序列(不连续);
6、 介绍一种强大的数据结构,Suffix tree.
这里有一个PPT: http://www.cppblog.com/Files/humanchao/StringAlg.zip
-------------------------------------------------
查找一个短串在一个长串中位置
这个问题传统的解法时间复杂度为O(m*n),m、n为两个串的长度。有一个Sunday算法,可以最大限度的优化这个比较过程,原理如下:
1、建立一个hash table,依次把search各个字符值作为table索引,为table相应的位置一个值(表示字符存在),如果出现重复,后面的位置会覆盖前面的位置。
例:我们要在"WHICH-FINALLY-HALTS.—AT-THAT-POINT"(简称string)查找" AT-THAT "(简称pat),刚开始时,把pat与string对齐,查看串string中与串pat 相对应的字符(F),在pat的位置,这个查找的过程时间复杂度通过hash table的下标索引为 O(1):
2、如果发现没有,说明字符F之前已经无法与pat匹配,直接跳到position(F)+stringlength(pat)
3、发现”-”在pat位置3,于是重新定位对齐两串为:
4、倒序(从最后一个向前)比较两串,发现无法匹配,继续跳转->查找->定位
因为上面已经有一个T匹配成功,这次要从HALTS的S来查找,于是定位为:
5、上图无法匹配,从”--AT-“中A后的”-”继续查找,重复上过程,最终匹配如图:
这个算法关键点:
1、建立为pat建立hash表,以提高查找字符的速度;
2、对齐跳转,快速的后移比较,使比较次数减少。
具体的代码实现可以参考链接:
http://blog.csdn.net/unicode1985/archive/2007/05/30/1631038.aspx
这些算法与内容包括:
1、 查找一个短串在一个长串中位置;
2、 查找一个字符串中最长的重复子串;
3、 查找一个字符串中重复最多的子串;
4、 两个字符串最长的公共子串(连续);
5、 两个字符串最长的公共子序列(不连续);
6、 介绍一种强大的数据结构,Suffix tree.
这里有一个PPT: http://www.cppblog.com/Files/humanchao/StringAlg.zip
-------------------------------------------------
查找一个短串在一个长串中位置
这个问题传统的解法时间复杂度为O(m*n),m、n为两个串的长度。有一个Sunday算法,可以最大限度的优化这个比较过程,原理如下:
1、建立一个hash table,依次把search各个字符值作为table索引,为table相应的位置一个值(表示字符存在),如果出现重复,后面的位置会覆盖前面的位置。
例:我们要在"WHICH-FINALLY-HALTS.—AT-THAT-POINT"(简称string)查找" AT-THAT "(简称pat),刚开始时,把pat与string对齐,查看串string中与串pat 相对应的字符(F),在pat的位置,这个查找的过程时间复杂度通过hash table的下标索引为 O(1):
2、如果发现没有,说明字符F之前已经无法与pat匹配,直接跳到position(F)+stringlength(pat)
3、发现”-”在pat位置3,于是重新定位对齐两串为:
4、倒序(从最后一个向前)比较两串,发现无法匹配,继续跳转->查找->定位
因为上面已经有一个T匹配成功,这次要从HALTS的S来查找,于是定位为:
5、上图无法匹配,从”--AT-“中A后的”-”继续查找,重复上过程,最终匹配如图:
这个算法关键点:
1、建立为pat建立hash表,以提高查找字符的速度;
2、对齐跳转,快速的后移比较,使比较次数减少。
具体的代码实现可以参考链接:
http://blog.csdn.net/unicode1985/archive/2007/05/30/1631038.aspx
相关文章推荐
- [C/C++]_[初级]_[标准库之几种算法库函数的运用,如字符串查找(字符个数查找)、分隔、删除、替换、排序、字符交换位置、大小写转换等等]
- [置顶] 在字符串中查找一个特定的字符第一次出现的位置,并返回字符所在位置;如果没有则返回NULL。
- 腾讯2017年实习生编程题目(第二题)----2.算法基础-字符移位 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
- 程序员面试金典: 9.11 排序与查找 11.5有个排序后的字符串数组,其中散布这一些空字符串,编写一个方法,找出给定字符串的位置
- 一个非常经典的算法查找字符串中每个字符的个数。
- 一个字符串中查找另一个字符出现的全部索引位置(JAVA)
- [置顶] 在字符串中查找一个特定的字符最后一次出现的位置,并返回字符所在位置。
- 使用boost查找区分大小写查找,查找一个字符串在另外一个字符串的位置,返回索引。
- kmp算法 查找一个字符串在另一个字符串出现的位置
- 在一个字符串中查找另外一个字符串的全排列出现位置
- [面试算法]把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。
- C++字符串处理的一个例子:1.查找一个字符在字符串中第n次出现的位置。2分割字符串
- 给一个字符串S和一个字符串数组T(T中的字符串要比S短许多),设计一个算法, 在字符串S中查找T中的字符串
- 利用Collections工具类查找一个字符串在字符串数组里的位置即其角标
- PTA 求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
- PHP - Manual手册 - CLXI. String 字符串处理函数 - strpos查找一个字符串第一次出现的位置
- 查找某字符串在另外一个字符串中最后出现的位置
- 利用Collections工具类查找一个字符串在字符串数组里的位置即其角标
- 关于在字符串中查找某一个字符的位置的方法
- 写一个函数,从一个字符串查找另一个字符串的位置