模式匹配(indexOf)

来源:互联网 发布:数控外圆磨床编程案例 编辑:程序博客网 时间:2024/06/06 13:57

简单串模式匹配算法

 

package com.test;public class Test {/** * 一个普通的模式匹配算法 * @param str 主串 * @param sub 模式串 * @param pos 位置 * @return 模式串的匹配的首个开始位置 */public static int indexOf1(String str, String sub, int pos){int i = pos;int j= 0;while(i < str.length() && j < sub.length()){if(str.charAt(i) == sub.charAt(j)){++i;++j;}else{i = i - j + 1;// j刚好可以记录i先前走了几步,利用j可以回溯指针i。j= 0;}}if(j == sub.length()){// 匹配的话,j刚好=sub最后下标+1(sub长度)return i - sub.length();}return -1;}/** * /java indexOf源码算法,进行了命名改动和变量简化 * 一个普通的模式匹配算法 * @param str 主串 * @param sub 模式串 * @param pos 位置 * @return 模式串的匹配的首个开始位置 */public static int indexOf2(String str, String sub, int pos){int strLen = str.length();int subLen = sub.length();//两个边界处理if (pos >= strLen) {            return (subLen == 0 ? strLen : -1);}    if (pos < 0) {        pos = 0;    }    //特殊值处理    if (subLen == 0) {    return pos;    }        char first  = sub.charAt(0);//模式串第一个字符        int max = strLen - subLen;//母串不必匹配到最后一个字符        for (int i = pos; i <= max; i++) {            /* 查找第一个字符 */            if (str.charAt(i) != first) {                while (++i <= max && str.charAt(i) != first);            }                        /* 找到第一个字符,现在找模式串的第二个字符 */            if (i <= max) {                int j = i + 1;                int end = j + subLen - 1;                for (int k = 1; j < end && str.charAt(j) == sub.charAt(k); j++, k++);                if (j == end) {                    /* 找到了整个串 */                    return i;                }            }        }        return -1;}public static void main(String[] args) {System.out.println(indexOf1("ababbabacc", "bb", 0));System.out.println(indexOf2("ababbabacc", "bb", 0));}}