檢查字串p是否是字串t的子串。因為要檢查整個定長的字串p,所以有時候這些演算法稱為精確字串匹配演算法。
為了便於討論,假設給定的字串t長度為n,要匹配的字串p的長度為m
/**
* 方法一:蠻力法
* 思路:
* 檢查text中每乙個可能位置,檢查pattern是否匹配。由於text的長度為n,所以有n-m+1個可選的位置來比較。
* 因為pattern的長度為m,所以txt中最後的m-1個位置無需檢查。
*@param text 文字
*@param pattern 需要匹配的字串
*@return 匹配字串在txt中起始索引
*/public
static
intbruteforcestringmatch(string text, string pattern)
// 如果匹配則返回txt中匹配的起始索引
if (j == m)
}return -1;
}
方法二:robin-karp演算法
思路:
使用雜湊技術代替文字text中每個可能的位置進行檢查的方法,即僅在pattern的雜湊值和text中m個字元的雜湊值相等時才檢查具體字元是否相同。
舉例:
假設字串的字元都是整數,即text中的所有字元都屬於。由於所有字元都是整數,可以把m個連續的字串看做十進位制數。
例如字串」61815」對應的十進位制數是61815。
按照上面的假設,pattern可以看做乙個十進位制,假設pattern對應的十進位制數為p
p = pattern[m-1] + 10*(pattern[m-2] + 10*(pattern[m-3] + … + 10*(pattern[1] + 10*pattern[0])…))
**實現,如下:
value = 0;
for(int i = 0; i < m; i++)
text中m個字元對應的十進位制為t(i)(i=0,1,2…n-m+1)
t(i+1) = 10 * (t(i) - 10^(m-1)*text[i+1]) + text(i+m+1)
例如,如果text=」123456」,m=3,t(0)=123,t(1)=10*(123-100*1)+4=234
逐步解釋如下:
第一步:移除第乙個數字,123-100*1=23
第二步:乘以10來移動第一步的結果,23*10=230
第三步:加上最後乙個數字,230+4=234
然後演算法對t(i)與p進行比較。當t(i)=p時,表示在text中找到子串pattern
參考:
robin-karp演算法**實現如下:
private
static
int d = 256;
private
static
int hashlength = 101; // hash表的長度,一般是個素數
public
static
introbinkarp(string text, string pattern)
int h = 1;
// the value of h would be "pow(d, m-1) % hashlength"
for (int i = 0; i < m - 1; i++)
// 精確匹配
// 只檢查txt的前n-m+1個可選的位置
int j = 0;
for (int i = 0; i <= (n - m); i++)
}// 如果匹配則返回text中匹配的起始索引
if (j == m)
}if (i < (n - m)) }}
return -1;
}
方法三:kmp(knuth morris pratt)字串匹配演算法
詳細講解請參考:
/**
* 根據pattern構造部分匹配表
*@param pattern
*/private
static
int f; // 字首函式、字首表或失配函式
public
static
void
prefixtable(string pattern) else
if (j > 0) else
}}public
static
intkmp(string text, string pattern) else
} else
if (j > 0) else
}return -1;
}
資料結構和演算法之美 32 字串匹配演算法
單模式串匹配的演算法,也就是乙個串跟乙個串進行匹配。包括bf演算法和rk演算法。也就是在乙個串中同時查詢多個串,它們分別是trie 樹和ac 自動機。bf 演算法是最簡單 粗暴的字串匹配演算法,它的實現思路是,拿模式串與主串中是所有子串匹配,看是否有能匹配的子串。所以,時間複雜度也比較高,是 o n...
資料結構與演算法(33) 字串習題
題目 反轉字串 方法一 通過字元陣列反轉 param string return public static string reversingstring1 string string 生成字元創 return new string str 方法二 字串反轉 param string return ...
演算法與資料結構 二 字串的模式匹配演算法
注意next陣列含義 kmp演算法 public class kmp kmp演算法,求最大公共子串在原字串的起始位置 param s 原字串 param p 子字串 return public static intkmp char s,char p else if j p.length return...