分享

字符串模式匹配

 shaobin0604@163.com 2006-11-10

/**
 * 字符串模式匹配
 */
import java.util.Arrays;

public class StringMatch {
 /**
  * @param string1
  * @param string2
  * @return
  */
 public static int indexOf(String string1, String string2, int pos) {
  int i = pos, j = 0;
  while (i < string1.length()) {
   while (j < string2.length()) {
    if (string1.charAt(i + j) == string2.charAt(j)) {
     j++;
    } else {
     break;
    }
   }
   if (j == string2.length())
    return i;
   else {
    i++;
    j = 0;
   }
  }
  return -1;
 }
 
 public static int indexOfKMP(String string1, String string2, int pos) {
  
  int[] next = new int[string2.length()];
  
  generateNextval(string2, next);
  
  int i = pos, j = 0;
  while (i < string1.length() && j < string2.length()) {
   if (j == -1 || string1.charAt(i) == string2.charAt(j)) {
    //继续比较后继字符
    i++;
    j++;
   } else {
    //模式串向右移动
    j = next[j];  
   }
  }
  if (j == string2.length())
   //匹配成功
   return i - string2.length();
  else
   return -1;
 }
 
 private static void generateNext(String modelstring, int[] next) {
  int i = 0, j = -1;
  next[0] = -1;
  while (i < modelstring.length() - 1) {
   if (j == -1 || modelstring.charAt(i) == modelstring.charAt(j)) {
    i++;
    j++;
    next[i] = j;
   } else {
    j = next[j];
   }
  }
 }
 
 private static void generateNextval(String modelstring, int[] next) {
  int i = 0, j = -1;
  next[0] = -1;
  while (i < modelstring.length() - 1) {
   if (j == -1 || modelstring.charAt(i) == modelstring.charAt(j)) {
    i++;
    j++;
    if (modelstring.charAt(i) != modelstring.charAt(j))
     next[i] = j;
    else
     next[i] = next[j];
   } else {
    j = next[j];
   }
  }
 }
 
 private static void testGenerateNext() {
  String a = "abaabcac";
  int[] next = new int[a.length()];
  int[] nextval = new int[a.length()];
  generateNext(a, next);
  generateNextval(a, nextval);
  System.out.println(Arrays.toString(next));
  System.out.println(Arrays.toString(nextval));
 }
 
 public static void main(String[] args) {
  System.out.println(indexOfKMP("ababcabcacbab", "abcac", 0));
//  testGenerateNext();
  
 }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多