• 数据结构 --- 串的匹配


      1 using System;
      2 using System.Text;
      3 using System.Collections.Generic;
      4 using System.Collections;
      5 using System.Text.RegularExpressions;
      6 using System.Timers;
      7 
      8 namespace ConsoleApplication1
      9 {
     10     class Program
     11     {
     12         static void Main(string[] args)
     13         {
     14             string s = "abcde123sadas";
     15             string p = "ababc";
     16 
     17             int[] array = GetNextArray(p);
     18             for (int i = 0; i < array.Length; ++i)
     19             {
     20                 Console.WriteLine(array[i]);
     21             }
     22 
     23             Console.ReadKey();
     24         }
     25 
     26         #region 字符串
     27 
     28         //字符串朴素匹配算法
     29         static int StringMatch(string s, string p)
     30         {
     31             int sLen = s.Length;
     32             int pLen = p.Length;
     33 
     34             int i = 0, j = 0;
     35             while (i < sLen && j < pLen)
     36             {
     37                 if (s[i] == p[j])
     38                 {
     39                     //如果当前字符匹配成功,继续比较
     40                     ++i;
     41                     ++j;
     42                 }
     43                 else
     44                 {
     45                     //如果失配,则令 i = i-j+1, j = 0
     46                     i = i - j + 1;
     47                     j = 0;
     48                 }
     49             }
     50 
     51             //匹配成功,返回p在s中的位置,否则返回 -1
     52             return j == pLen ? i - j : -1;
     53         }
     54 
     55         #region KMP匹配
     56         //计算字符串 s 的 Next 数组
     57         static int[] GetNextArray(string s)
     58         {
     59             //next数组值的含义 --- 当前位置匹配失败的时候,下标应该改变到的位置。
     60             int[] next = new int[s.Length];
     61             int pLen = s.Length;
     62             int k = -1;
     63             int j = 0;
     64 
     65             next[j] = k;
     66 
     67             while (j < pLen - 1)
     68             {
     69                 //s[k] --- 前缀的各个字符  s[j] --- 后缀的各个字符
     70                 if (k == -1 || s[k] == s[j])
     71                 {
     72                     ++k;
     73                     ++j;
     74                     next[j] = k;
     75                 }
     76                 else
     77                 {
     78                     k = next[k];
     79                 }
     80             }
     81 
     82             return next;
     83         }
     84 
     85         static int KMPMatch(string s, string p)
     86         {
     87             int sLen = s.Length;
     88             int pLen = p.Length;
     89 
     90             int i = 0, j = 0;
     91 
     92             int[] next = GetNextArray(p);
     93 
     94             while (i < sLen && j < pLen)
     95             {
     96                 if (j == -1 || s[i] == p[j])
     97                 {
     98                     //如果当前字符匹配成功,继续比较
     99                     ++i;
    100                     ++j;
    101                 }
    102                 else
    103                 {
    104                     j = next[j];
    105                 }
    106             }
    107 
    108             //匹配成功,返回p在s中的位置,否则返回 -1
    109             return j == pLen ? i - j : -1;
    110         }
    111 
    112         #endregion
    113 
    114         #endregion
    115     }
    116 }
  • 相关阅读:
    基于红帽5裁剪一个简单的Linux
    Linux系统初始化流程
    bash学习记录
    ubuntu 上安装MySQL
    Effective Modern C++ 条款4:掌握查看型别推导结果的方法
    Effective Modern C++ 条款3:理解decltype
    ubuntu 环境下向GitHub上传(push)每次都需要用户名密码问题
    Effective Modern C++ 条款2:理解auto型别推导
    Effective Modern C++  条款1:理解模板型别推导
    ubuntu16.04环境编译gSOAP
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/9951361.html
Copyright © 2020-2023  润新知