zoukankan      html  css  js  c++  java
  • 串的两种模式匹配算法

      模式匹配(模范匹配):子串在主串中的定位称为模式匹配或串匹配(字符串匹配) 。模式匹配成功是指在主串S中能够找到模式串T,否则,称模式串T在主串S中不存在。

      以下介绍两种常见的模式匹配算法:

    1. Brute-Force模式匹配算法 暴风算法,又称暴力算法。

      算法的核心思想如下:
      设S为目标串,T为模式串,且不妨设:
      S=“s0s1s2…sn-1” , T=“t0t1t2 …tm-1”
      串的匹配实际上是对合法的位置0≦i≦n-m依次将目标串中的子串s[i…i+m-1]和模式串t[0…m-1]进行比较:

    • 若s[i…i+m-1]=t[0…m-1]:则称从位置i开始的匹配成功,亦称模式t在目标s中出现;
    • 若s[i…i+m-1]≠t[0…m-1]:从i开始的匹配失败。位置i称为位移,当s[i…i+m-1]=t[0…m-1]时,i称为有效位移;当s[i…i+m-1] ≠t[0…m-1]时,i称为无效位移。

      算法实现如下:

      (笔者偷懒,用C#实现,实际上C# String类型已经封装实现了该功能)

     1 public static Int32 IndexOf(String parentStr, String childStr)
     2         {
     3             Int32 result = -1;
     4             try
     5             {
     6                 if (parentStr.Length > 1 && childStr.Length > 1)
     7                 {
     8                     Int32 i = 0;
     9                     Int32 j = 0;
    10                     while (i < parentStr.Length && j < childStr.Length)
    11                     {
    12                         if (parentStr[i] == childStr[j])
    13                         {
    14                             i++;
    15                             j++;
    16                         }
    17                         else
    18                         {
    19                             i = i - j + 1;
    20                             j = 0;
    21                         }
    22                     }
    23                     if (i < parentStr.Length)
    24                     {
    25                         result = i - j;
    26                     }
    27                 }
    28             }
    29             catch (Exception)
    30             {
    31                 result = -1;
    32             }
    33             return result;
    34         }

      该算法的时间复杂度为O(n*m) ,其中n 、m分别是主串和模式串的长度。

      2.KMP算法,该算法是对上述暴风算法的一种改进实现算法,其改进之处在于:

      每当一趟匹配过程出现字符不相等时,主串指示器不用回溯,而是利用已经得到的“部分匹配”结果,将模式串的指示器向右“滑动”尽可能远的一段距离后,继续进行比较。核心思想:“利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置

  • 相关阅读:
    linux磁盘挂载
    3个方法解决百度网盘限速 (2018-07-20)
    mysql状态分析之show global status
    Cgroups子系统介绍
    Go语言 关键字:defer
    Go语言 map的实现
    Go语言 基本类型
    MySQL 监控指标
    sshpass的使用方法
    C++11 std::ref使用场景
  • 原文地址:https://www.cnblogs.com/mohanchen/p/9311909.html
Copyright © 2011-2022 走看看