算法与数据结构练习中常犯错误4——字符串相关算法

3.字符串

3.1 字符串压缩

3.2 字符串查找——trie树

3.3 子字符串查找

3.3.1 暴力解法

3.3.2 DFA

3.3.3 KMP

3.3.4 Boyer-Moore

  • 47)忘了对数组初始化
        // 忘了对数组进行初始化
        goodSuffix = new int[pattern.length()];
        prefix = new boolean[pattern.length()];
  • 48)calculateGoodSuffix()
            while (j >= 0 && pattern.charAt(j) == pattern.charAt(pattern.length() - 1 - i + j)) {
                --j;
                ++k;
                // 这个更新应该放在循环内部而不是外部
                goodSuffix[k] = j + 1;
            }
  • 49)好后缀规则的适用条件
            int len = pattern.length() - 1 - j;
            // 对于好后缀规则,必须len > 0才成立,如果不加这一条会出错
            if (len > 0) {

3.4 正则表达式

  • 50)lp多种情况的考虑
            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 后缀数组

你可能感兴趣的:(算法与数据结构练习中常犯错误4——字符串相关算法)