C#,字符串匹配(模式搜索)Sunday算法的源代码

发布时间:2024年01月18日

Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法。

核心思想:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

Sunday算法思想跟BM(Boyer Moore)算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即:移动步长=匹配串长度+1;否则,同BM算法一样,其移动步长=匹配串中最右端的该字符到末尾的距离+1
?

本代码运行效果:

源代码:

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
?? ?public static partial class PatternSearch
?? ?{
?? ??? ?/// <summary>
?? ??? ?/// 字符位置表
?? ??? ?/// </summary>
?? ??? ?private static int ALPHA_BET = 512;

?? ??? ?/// <summary>
?? ??? ?/// 计算字符的出现位置表
?? ??? ?/// </summary>
?? ??? ?/// <param name="pattern"></param>
?? ??? ?/// <returns></returns>
?? ??? ?private static int[] ComputeOccurence(string pattern)
?? ??? ?{
?? ??? ??? ?int[] table = new int[ALPHA_BET];
?? ??? ??? ?for (char a = (char)0; a < (char)ALPHA_BET; a++)
?? ??? ??? ?{
?? ??? ??? ??? ?table[(int)a] = -1;
?? ??? ??? ?}

?? ??? ??? ?for (int i = 0; i < pattern.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?char a = pattern[i];
?? ??? ??? ??? ?table[(int)a] = i;
?? ??? ??? ?}
?? ??? ??? ?return table;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 字符串匹配算法(模式搜索)Sunday算法
?? ??? ?/// </summary>
?? ??? ?/// <param name="text"></param>
?? ??? ?/// <param name="pattern"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public static List<int> Sunday_Search(string text, string pattern)
?? ??? ?{
?? ??? ??? ?List<int> matchs = new List<int>();

?? ??? ??? ?int i = 0;
?? ??? ??? ?int[] table = ComputeOccurence(pattern);
?? ??? ??? ?while (i <= text.Length - pattern.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?int j = 0;
?? ??? ??? ??? ?while (j < pattern.Length && text[i + j] == pattern[j])
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?j++;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if (j == pattern.Length)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?matchs.Add(i);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?i += pattern.Length;
?? ??? ??? ??? ?if (i < text.Length)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?i -= table[(int)text[i]];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return matchs;
?? ??? ?}
?? ?}
}

?——————————————————————

POWER BY 315SOFT.COM &
TRUFFER.CN

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
?? ?public static partial class PatternSearch
?? ?{
?? ??? ?/// <summary>
?? ??? ?/// 字符位置表
?? ??? ?/// </summary>
?? ??? ?private static int ALPHA_BET = 512;

?? ??? ?/// <summary>
?? ??? ?/// 计算字符的出现位置表
?? ??? ?/// </summary>
?? ??? ?/// <param name="pattern"></param>
?? ??? ?/// <returns></returns>
?? ??? ?private static int[] ComputeOccurence(string pattern)
?? ??? ?{
?? ??? ??? ?int[] table = new int[ALPHA_BET];
?? ??? ??? ?for (char a = (char)0; a < (char)ALPHA_BET; a++)
?? ??? ??? ?{
?? ??? ??? ??? ?table[(int)a] = -1;
?? ??? ??? ?}

?? ??? ??? ?for (int i = 0; i < pattern.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?char a = pattern[i];
?? ??? ??? ??? ?table[(int)a] = i;
?? ??? ??? ?}
?? ??? ??? ?return table;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 字符串匹配算法(模式搜索)Sunday算法
?? ??? ?/// </summary>
?? ??? ?/// <param name="text"></param>
?? ??? ?/// <param name="pattern"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public static List<int> Sunday_Search(string text, string pattern)
?? ??? ?{
?? ??? ??? ?List<int> matchs = new List<int>();

?? ??? ??? ?int i = 0;
?? ??? ??? ?int[] table = ComputeOccurence(pattern);
?? ??? ??? ?while (i <= text.Length - pattern.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?int j = 0;
?? ??? ??? ??? ?while (j < pattern.Length && text[i + j] == pattern[j])
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?j++;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if (j == pattern.Length)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?matchs.Add(i);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?i += pattern.Length;
?? ??? ??? ??? ?if (i < text.Length)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?i -= table[(int)text[i]];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return matchs;
?? ??? ?}
?? ?}
}

文章来源:https://blog.csdn.net/beijinghorn/article/details/124090615
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。