資料結構與演算法(32) 字串演算法

2021-08-01 17:08:05 字數 2423 閱讀 4344

檢查字串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...