利用有限自动机进行字符串匹配

本文深入探讨了一种字符串匹配算法,通过定义状态转移函数和最大前缀函数,实现了对目标字符串中子串出现位置的有效查找。文章提供了完整的C语言实现代码,并通过实例演示了算法的应用过程。

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int maxPrefix(const char* str1, const char* str2);

int
state_transport(const char* p, const int n, const int m, char a)
{
  char pk[n+2];
  strncpy(pk, p, n);
  pk[n]=a;
  pk[n+1]='\0';
  return maxPrefix(pk, p);
}

int
maxPrefix(const char* str1, const char* str2)
{
  int len1=strlen(str1);
  int len2=strlen(str2);
  int i , j, k;
  int count = 0;
  int maxCount=0;
  int l = len1 > len2 ? len2:len1;
  for(i=1; i<=l; ++i){
    for(k=len1-i, j=0;k<len1 && j<len2; ++k, ++j){
      if(str1[k]==str2[j]){
	count++;
      }
      else{
	count = 0;
	break;
      }
    }
    if(count > maxCount) maxCount=count;
    count = 0;
  }
  return maxCount;
}

int
matchCount(const char* t, const char* sub_str, int m)
{
  int len = strlen(t);
  int q = 0;
  for(int i = 0; i < len; ++i){
    q = state_transport(sub_str, q, m, t[i]);
    if(q == m){
      printf("occur in %d\n", i+1-m);
    }
  }
}

int
main()
{
  const char* str1="abcababababab";
  const char* str2="abab";
  matchCount(str1, str2, 4);
}

转载于:https://www.cnblogs.com/zjfdlut/archive/2011/10/12/2208770.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值