溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Boyer Moore算法實現(xiàn)(壞字符規(guī)則)

發(fā)布時間:2020-09-20 07:20:59 來源:網(wǎng)絡(luò) 閱讀:777 作者:cnn237111 欄目:編程語言

根據(jù)阮一峰的博客

http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html

試寫算法。

使用好后綴的方法比較復(fù)雜,暫未實現(xiàn)。

只實現(xiàn)了通過壞字符的方法,事實上Boyer-Moore-Horspool算法是簡化版的Boyer-Moore算法,它只使用壞字符規(guī)則。

具體代碼如下:

  1. class Program  
  2.   {  
  3.       static void Main(string[] args)  
  4.       {  
  5.           string source = "HERE IS A SIMPLE EXAMPLE";  
  6.           string pattern = "EXAMPLE";  
  7.  
  8.           BoyerMoore(source.ToCharArray(), pattern.ToCharArray());  
  9.       }  
  10.  
  11.       static int BoyerMoore(char[] source, char[] pattern)  
  12.       {  
  13.           Dictionary<charint> PostionDictionary = GetPostionDictionary(pattern);  
  14.           int pattern_length = pattern.Length;  
  15.           int start_pointer = 0;  
  16.           int end_pointer = start_pointer + pattern_length - 1;  
  17.           int offset = 0;  
  18.  
  19.           int offset_for_print = 0;  
  20.  
  21.           while (end_pointer <= source.Length)  
  22.           {  
  23.               Console.WriteLine(source);  
  24.               Console.WriteLine(new String(pattern).PadLeft(offset_for_print + pattern_length,'-'));  
  25.  
  26.               char[] Chars = subChars(source, start_pointer, end_pointer);  
  27.               char badChar;  
  28.               int badPostion;  
  29.               if (checkIsEqual_badChar(pattern, Chars, out badChar, out badPostion))  
  30.               {  
  31.                   Console.WriteLine(start_pointer + "," + end_pointer);  
  32.  
  33.                   start_pointer += pattern_length;  
  34.                   end_pointer = start_pointer + pattern_length - 1;  
  35.                   offset_for_print += pattern_length;  
  36.  
  37.                   continue;  
  38.               }  
  39.               else 
  40.               {  
  41.                   if (PostionDictionary.ContainsKey(badChar))  
  42.                   {  
  43.                       //計算偏移量  
  44.                       offset = badPostion - PostionDictionary[badChar];  
  45.                   }  
  46.                   else 
  47.                   {  
  48.                       offset = badPostion + 1;  
  49.                   }  
  50.                   start_pointer += offset;  
  51.                   end_pointer = start_pointer + pattern_length - 1;  
  52.                   offset_for_print += offset;  
  53.               }  
  54.           }  
  55.           return 0;  
  56.       }  
  57.  
  58.       static bool checkIsEqual_badChar(char[] pattern, char[] Chars, out char badChar, out int badPostion)  
  59.       {  
  60.           if (pattern.Length != Chars.Length)  
  61.           {  
  62.               throw new Exception("length error");  
  63.           }  
  64.  
  65.           for (int i = pattern.Length - 1; i >= 0; i--)  
  66.           {  
  67.               if (pattern[i] != Chars[i])  
  68.               {  
  69.                   badChar = Chars[i];  
  70.                   badPostion = i;  
  71.                   return false;  
  72.               }  
  73.           }  
  74.           badChar = '\0';  
  75.           badPostion = -1;  
  76.           return true;  
  77.       }  
  78.  
  79.      
  80.       /// <summary>  
  81.       /// 根據(jù)起始位置和結(jié)束位置,給出子串  
  82.       /// </summary>  
  83.       /// <param name="source"></param>  
  84.       /// <param name="start"></param>  
  85.       /// <param name="end"></param>  
  86.       /// <returns></returns>  
  87.       static char[] subChars(char[] source, int start, int end)  
  88.       {  
  89.           char[] c = new char[end - start + 1];  
  90.  
  91.           for (int i = start; i <= end; i++)  
  92.           {  
  93.               c[i - start] = source[i];  
  94.           }  
  95.  
  96.           return c;  
  97.  
  98.       }  
  99.  
  100.       /// <summary>  
  101.       /// 生成壞字符位置表  
  102.       /// </summary>  
  103.       /// <param name="chars"></param>  
  104.       /// <returns></returns>  
  105.       static Dictionary<charint> GetPostionDictionary(char[] chars)  
  106.       {  
  107.           Dictionary<charint> d = new Dictionary<charint>();  
  108.  
  109.           for (int i = 0; i < chars.Length; i++)  
  110.           {  
  111.               if (d.ContainsKey(chars[i]) == false)  
  112.               {  
  113.                   d.Add(chars[i], i);  
  114.               }  
  115.               else//存在則覆蓋  
  116.               {  
  117.                   d[chars[i]] = i;  
  118.               }  
  119.           }  
  120.           return d;  
  121.       }  
  122.   } 

測試數(shù)據(jù)輸出圖:

Boyer Moore算法實現(xiàn)(壞字符規(guī)則)

Boyer Moore算法實現(xiàn)(壞字符規(guī)則)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI