public class dfaandkmp
curword += document.charat(i);
mapcurmap = (map) curobj;
if (curmap.size() == 0)
// 最小匹配則直接返回結果
if (matchtype == 0)
curwordmap = wordmap;
curword = "";
// 開始下乙個字元的匹配
i = n++;
curwordmap = curmap;}}
return matchres;
}/**
* 利用kmp演算法查詢字元匹配次數
* @param document 查詢文件
* @param matchtype 匹配規則:0最小規則,1最大規則
* @return
*/public static int kmpsearch(string document, string keyword, int matchtype)
}// 繼續匹配下乙個字元
j++;
i++;
continue;
} else
// 使用kmp部分匹配值進行移動,然後重新開始匹配
int kmpvalue = getkmpvalue(keyword.substring(0, j));
curnext += (j - kmpvalue);
i = curnext + kmpvalue;
j = kmpvalue;}}
return matchcount;
}/**
* 構造關鍵字map
*/private static mapcreatewordmap(setkeywords) else
// 最後乙個字元,設定為空map
if (i == keyword.length() - 1)
}});
return keywordsmap;
}/**
* 獲取kmp部分匹配值
* @return
*/private static int getkmpvalue(string partmatch)
// 字首集合(除了最後乙個字元以外,乙個字串的全部頭部組合)
setprefix = new hashset<>();
// 字尾集合(指除了第乙個字元以外,乙個字串的全部尾部組合)
setsuffix = new hashset<>();
// 獲取字首集合、字尾集合
int length = partmatch.length();
for (int i = 0; i < length; i++)
}// 獲取部分匹配值("字首"和"字尾"的最長共有元素的長度)
prefix.retainall(suffix);
if (prefix.size() <= 0)
int value = prefix.stream()
.max(comparator.comparingint(string::length))
.get()
.length();
return value;
}public static void main(string args) ;
string document = "此次電結他開始,電結他開始做電影視節日計費電影視節";
mapstringintegermap = dfasearch(document, new hashset<>(arrays.aslist(keyworks)), 1);
system.out.println("dfa匹配結果:" + stringintegermap);
string kmptest = "abcdabfabcdabcdabdeabcdabdabc";
int count = kmpsearch(kmptest, "abcdabdeee", 1);
system.out.println("kmp匹配次數:" + count);
}}
KMP字元匹配
在kmp 中,主要是尋找模式字串的字首和字尾的最長的共有元素的長度。以 abcdabd 為例,a 的字首和字尾都為空集,共有元素的長度為0 ab 的字首為 a 字尾為 b 共有元素的長度為0 abc 的字首為 a,ab 字尾為 bc,c 共有元素的長度0 abcd 的字首為 a,ab,abc 字尾為...
KMP字元匹配
kmp 演算法是在 s中查詢子串 p,如果存在,返回這個子串的起始索引,否則返回空列表輸入 文字串s bbc abcdab abcdabcdabde 模式串p abcdabd 輸出 15 解釋 起始索引等於 15 長度為 7 的子串是 abcdabde s abcdabcdabd p abcdabd...
正則匹配字串無匹配不到 字串匹配演算法
我們先說下定義,比如說我們要在a字串中查詢字串b,那麼a就是主串,b就是模式串 我們把主串的長度記為n,把模式串的長度記為m,n m bf brute force 中文名 暴力匹配演算法,樸素匹配演算法 簡單的說bf的演算法就是在主串中查詢起始位置是0,1,2,n m個且長度為m的n m 1個子串,...