在另一个字符串中查找字符串的位置

时间:2010-03-03 08:40:39

标签: c++ algorithm data-structures string query-string

  

可能重复:
  substring algorithm

给定两个字符串A和B,如何在A中找到B的第一个位置? 例如,A =“ab123cdefgcde”; B =“cde” 然后A中B的第一个位置是5.

有什么技巧可以解决这个问题,或者只是从头开始搜索A?

7 个答案:

答案 0 :(得分:6)

你真的必须从头开始扫描A.

有很好的快速子串搜索算法,例如: http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

还有一个标准函数strstr

strstr(A,B)

http://www.cplusplus.com/reference/clibrary/cstring/strstr/

答案 1 :(得分:3)

答案 2 :(得分:1)

解决此问题的最佳方法是使用KMP算法:http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

答案 3 :(得分:1)

“Trick”是算法的另一个词,我想。最着名的是Knuth-Morris-Pratt

答案 4 :(得分:1)

您正在解决的问题是“确切的字符串匹配”问题。天真的解决方案在O(n ^ 2)时间运行,但你可以做得更好。解决这个问题的一些线性时间算法是Knuth-Morris-Pratt(KMP),Boyer-Moore和Apostolico-Giancarlo。解决它的另一种方法是构造一个有限状态自动机,当它看到模式字符串时进入接受状态。最好的解决方案是O(n),所有那些都有最坏的运行时间。你必须从一端到另一端扫描字符串;但是,有可能跳过一小部分人物(Boyer-Moore和Apostolico-Giancarlo将会这样做),因为一些不匹配可能意味着其他不匹配。

如果您需要自己编写代码,我建议您使用Knuth-Morris-Pratt算法,因为它比我提到的其他解决方案更直观,更容易实现。但是,大多数编程语言都有一个“indexOf”或“find”函数,可以为您解决这个问题。

答案 5 :(得分:0)

  

在C编程中,你有函数strstr来查找源中的子字符串位置   串。

答案 6 :(得分:0)

如果您有 big 字符串,并且您要搜索许多子字符串, 记住suffix array结构是件好事 基本上,您创建一个指针数组,然后对其进行排序 然后,您可以使用二进制搜索找到任何子字符串。