朴素的串模式匹配(C语言实现)【串模式匹配】

  • 算法思想
  • 算法描述
  • 算法实现
  • 测试结果
  • 朴素的模式匹配算法评价

算法思想

从主串 S 的第 pos 个字符起和模式 T 的第一个字符比较之,若相同,则继续比较后续字符;否则从主串 S 的下一个字符起再重新和模式 T 的字符比较之。

例:S = ‘JINANSHI’,T = ‘NAN’。

朴素的串模式匹配(C语言实现)【串模式匹配】_第1张图片

算法描述

当采用定长顺序存储结构时,实现此操作的算法如下:

int Index(SString S, SString T, int pos)
{
       
	i = pos;  j = 1;
    while (i <= S[0] && j <= T[0]) 
    {
     
    	if (S[i] == T[j]) 
     	{
      
     		++ i; 
     	 	++ j; 
     	 }   // 继续比较后继字符
     	 else 
         {
     
             i = i – j + 2;  
             j = 1; 
         }   // 指针后退重新开始匹配  
      }
       
       if ( j >T[0])    
       		return i -T[0];
       else    
       		return 0;
} // Index

算法实现

#include 
#include 

#define MAXSTRLEN 255

//存储结构
typedef unsigned char SString[MAXSTRLEN + 1];
//基于该存储结构实现朴素的模式匹配
int Index(SString S, SString T, int pos)
{
     
    int i = pos;  
    int j = 1;
    while (i <= S[0] && j <= T[0])
    {
     
        if (S[i] == T[j])
        {
     
            ++i;
            ++j;
        }   // 继续比较后继字符
        else
        {
     
            i = i - j + 2;
            j = 1;
        }   // 指针后退重新开始匹配  
    }

    if (j > T[0])
        return i - T[0];
    else
        return 0;
}

bool StrAssign(SString str, char* src)
{
     
    char * c = src;
    int i = 0;
    for (; *c != '\0'; ++i, ++c)
    {
     
        if (0 == i)
            str[0] = 0;
        else
        {
     
            str[0] = 0;
            for (int j = 1; j <= i; j++)
            {
     
                str[j] = src[j - 1];
                str[0] += 1;
            }
        }
    }
    return true;
}

int main()
{
     
    SString s;
    SString t;

    char x[] = "abcdefg";
    char y[] = "fg";

    StrAssign(s, x);
    StrAssign(t, y);

    int pos = Index(s, t, 3);
    if (pos != 0)
        printf("模式匹配成功,找到位置为%d\n", pos);
    else
        printf("模式匹配失败");
    return 0;
}

测试结果

测试结果

朴素的模式匹配算法评价

设计思想简单、易于理解。

通常情况下,效率比较高。经常被程序员选用。
此时算法的时间复杂度为:O(n+m)
m、n分别为主串和子串的长度。

某些特殊的情况下,效率比较低。
此时算法的时间复杂度为:O(n*m)
m、n分别为主串和子串的长度。

你可能感兴趣的:(朴素的串模式匹配(C语言实现)【串模式匹配】)