1. 程式人生 > 實用技巧 >字串匹配--最大最小表示法模板

字串匹配--最大最小表示法模板

概述

參考資料:

字串匹配—最大最小表示法

最小表示法和最大表示法模板

最小(大)表示法是字串問題中不同於匹配與失配的另一種O(n)的演算法,它主要解決的是字串的同構問題。將單個字串迴圈左移右移算作該串的同構,最小(大)表示法能夠在O(n)時間內求出這個串的所有同構串中的字典序最小的串的起始位置。由於程式碼簡潔容易理解,因此在處理同類問題時往往比字尾陣列以及各種匹配演算法更加方便運用。

注意下標是從0開始的,返回的下標也從0開始

程式碼

最小表示法

 1 int getMin(char str[],int len)
 2 {
 3     int i = 0,j = 1,k;
 4     while
(i < len && j < len) 5 { 6 for(k = 0;k < len;k++) 7 if(str[(i+k)%len] != str[(j+k)%len]) 8 break; 9 if(k >= len) break; 10 if(str[(i+k)%len] > str[(j+k)%len]) 11 { 12 if(i+k+1 > j) 13 i = i+k+1;
14 else 15 i = j+1; 16 } 17 else 18 if(j+k+1 > i) 19 j = j+k+1; 20 else 21 j = i+1; 22 } 23 // return i < j ? i : j; 24 return min(i,j); 25 }

最大表示法

 1 int getMax(char str[],int len)
 2 {
 3
int i = 0,j = 1,k = 0; 4 while(i < len && j < len && k < len) 5 { 6 int t = str[(i+k)%len]-str[(j+k)%len]; 7 if(!t) 8 k++; 9 else 10 { 11 if(t > 0) 12 { 13 if(j+k+1 > i) 14 j = j+k+1; 15 else 16 j = i+1; 17 } 18 else 19 if(i+k+1 > j) 20 i = i+k+1; 21 else 22 i = j+1; 23 k = 0; 24 } 25 } 26 // return i < j ? i : j; 27 return min(i,j); 28 }