3.字符串
3.1 字符串压缩
3.2 字符串查找——trie树
3.3 子字符串查找
3.3.1 暴力解法
3.3.2 DFA
3.3.3 KMP
3.3.4 Boyer-Moore
// 忘了对数组进行初始化
goodSuffix = new int[pattern.length()];
prefix = new boolean[pattern.length()];
while (j >= 0 && pattern.charAt(j) == pattern.charAt(pattern.length() - 1 - i + j)) {
--j;
++k;
// 这个更新应该放在循环内部而不是外部
goodSuffix[k] = j + 1;
}
int len = pattern.length() - 1 - j;
// 对于好后缀规则,必须len > 0才成立,如果不加这一条会出错
if (len > 0) {
3.4 正则表达式
int lp = i;
// (和|需要压入栈,以备后续添加ε-转换
if (c == '(' || c == '|') {
stack.push(i);
} else if (c == ')') {
int or = stack.pop();
if (regex.charAt(or) == '|') {
// 这里不能另外定义left,还必须是lp,因为或后面也可能是*
lp = stack.pop();
G.addEdge(lp, or + 1);
G.addEdge(or, i);
} else if (regex.charAt(or) == '('){
// 此时lp为左括号
lp = or;
}
}
// 这里合并了A*和(xxx)*两种情况,通过lp来合并
if (i < m - 1 && regex.charAt(i + 1) == '*') {
G.addEdge(lp, i + 1);
G.addEdge(i + 1, lp);
}
3.5 后缀数组
网友评论