程序员面试题精选(52):字符串匹配实现(回溯与不回溯算法)

本文深入探讨了两种不同的字符串匹配算法:一种是简单的回溯方法,适用于基本的搜索需求;另一种则是利用Boyer-Moore算法的高效搜索策略,通过预处理模式串构建位移表来加速搜索过程。通过对这两种方法的对比分析,读者可以了解如何根据具体应用场景选择合适的字符串匹配策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回溯:

const   char *  MyStrStr( const   char   * text,  const   char   * pattern)
 2  {
 3      int  i  =   0 , j  =   0 ;
 4
 5      while  (pattern[i]  &&  text[j])
 6      {
 7          if  (pattern[i]  ==  text[j])
 8          {
 9              ++ i;
10              ++ j;
11         }
 
12          else
13          {
14             i  =   0 ;
15             j  =  j  -  i  +   1 ;
16         }

17     }
// while
18
19      if  ( ! pattern[i])
20      {
21          return  text  +  j  -  i;
22     }
 
23      else
24      {
25          return   0 ;
26     }

27 } 

不回溯:

#include  < cstring >
 2 int  BM( const   char   * text,  const   char   * pattern)
 3  
{
 4      int  arrShiftTable[ 256
];
 5      int  tLen  =
 strlen(text);
 6      int  pLen  =
 strlen(pattern);
 7      int
 currPos, tReadPos, pReadPos;
 8

 9      // exclude NUL

10      for  ( int  i  =   1 ; i  <   sizeof  arrShiftTable  /   sizeof  ( int ); i ++ )
11      
{
12         arrShiftTable[i]  =
 pLen;
13     }

14
15      // exclude the last char in pattern

16      for  ( int  i  =   0 ; i  <  pLen  -   1 ; i ++ )
17      
{
18         arrShiftTable[pattern[i]]  =  pLen  -   1   -
 i;
19     }

20
21      for  (currPos  =  pLen  -   1 ; currPos  <  tLen;  /* null */
)
22      
{
23          for  (pReadPos  =  pLen  -   1 , tReadPos  =
 currPos;
24             pReadPos  >=   0   &&  pattern[pReadPos]  ==
 text[tReadPos];
25             pReadPos -- , tReadPos --
)
26              /* null */
;
27

28          if  (pReadPos  <   0
)
29          
{
30              return  tReadPos  +   1
;
31         }
 
32          else

33          {
34             currPos  +=
 arrShiftTable[text[currPos]];
35         }

36
37     }
// outer for
38
39      return   - 1 ;
40 } 
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值