1. 程式人生 > >字串模式匹配中BF演算法和KMP演算法的java實現

字串模式匹配中BF演算法和KMP演算法的java實現

關於BF演算法和KMP演算法的具體解釋,文章【部落格地址】:KMP字串匹配演算法與next陣列中有推薦部落格的具體地址,可以在這些部落格中找到詳細的解釋。

以下只有具體的java程式碼實現:

BF演算法

package com.algorithm;

/**
 * 字串模式匹配的 Brute-Force演算法(暴力法)
 * @author Administrator
 *
 */

public class StrMatchBF {

    public static void main(String[] args) {
        StrMatchBF strMatchBF = new
StrMatchBF(); String iniStr = "hello world"; String patternStr = "world"; System.out.println(strMatchBF.indexOfStr(iniStr, patternStr)); // 輸出6 } /** * 匹配字串 * @param iniStr 原始字串 * @param patternStr 模式字串 * @return 如果模式字串在原始字串中存在,返回模式字串在原始字串中第一次出現的索引。 */
public int indexOfStr(String iniStr, String patternStr) { if(iniStr == null || iniStr.length() <= 0 || patternStr == null || patternStr.length() <=0) return -1; int iniLength = iniStr.length(); int patternLength = patternStr.length(); int
i = 0, j = 0; while(i < iniLength && j < patternLength) { if(iniStr.charAt(i) == patternStr.charAt(j)) { i++; j++; } else { // 失配,回退 i = i - j + 1; j = 0; } } if(j == patternLength) return i - patternLength; else return -1; } }

KMP演算法

package com.algorithm;

/**
 * 字串匹配的KMP演算法
 * @author Administrator
 *
 */


public class StrMatchKMP {

    public static void main(String[] args) {
        StrMatchKMP strMatchKMP = new StrMatchKMP();
        String iniStr = "hello world";
        String patternStr = "world";
        System.out.println(strMatchKMP.indexOfStrKMP(iniStr, patternStr));
    }


    public int indexOfStrKMP(String iniStr, String patternStr) {
        if(iniStr == null || iniStr.length() <= 0 ||
                patternStr == null || patternStr.length() <= 0)
            return -1;

        // 得到模式串的next陣列
        int[] nextArr = getNextArray(patternStr);
        int iniLength = iniStr.length();
        int patternLength = patternStr.length();
        int i = 0;  // 原始串索引
        int j = 0;  // 模式串索引
        while(i < iniLength && j < patternLength) {
            if(j == -1 || iniStr.charAt(i) == patternStr.charAt(j)) {
                i++;
                j++;
            } else {
                j = nextArr[j];
            }
        }
        if(j == patternLength)
            return i - patternLength;
        else 
            return -1;
    }

    /**
     * 獲取模式字串的next陣列
     * @param str
     * @return
     */
    public int[] getNextArray(String str) {
        if(str == null || str.length() <= 0)
            return null;

        int length = str.length();
        int[] nextArr = new int[length];
        int j = 0;
        int k = -1;
        nextArr[0] = -1;
        while(j < length - 1) {
            if(k == -1 || str.charAt(j) == str.charAt(k)) {
                j++;    // 匹配,移動
                k++;
                if(str.charAt(j) != str.charAt(k))
                    nextArr[j] = k;
                else 
                    nextArr[j] = nextArr[k];
            } else {
                k = nextArr[k];
            }
        }
        return nextArr;
    }
}