字符串模式匹配sunday算法

算法的基本思想是,模式串和主串从后往前比较,遇到无法匹配的字符的时候,看主串参加匹配的最后一个字符的下一个字符,然后分两种情况:

1、如果该字符没有出现在模式串中,就把模式串向右移动模式串的长度+1个位置

比如:主串:  ababcdababa

      模式串:ababa

      到c的位置无法匹配,看c后面的d没有出现在模式串中,则向右移动5+1个位置,结果为:

      主串:  ababcdababa

      模式串:      ababa

也就是说移动到d后面的一个字符。

2、如果该字符出现在模式串中,则向右移动该字符在模式串中出现的最右边那次”到字符串末尾的长度+1

比如:主串:  ababcababa

      模式串:ababa

      到c的位置无法匹配,看c后面的a出现在模式串中,而模式串中有3个a,我们看最右边那个a,则向右移动0+1个位置,结果为:

      主串:  ababcababa

      模式串: ababa


java代码实现

package com.dm.string;

/**
 * sunday算法匹配查找字符串:大意:匹配模式串的开头,结尾字符,按模式串长度,向后偏移,再回查。判断某串中是否包含,查找速度比普通的匹配和正则速度要快。
 */
public class SunDay {
	/**
	 * Sunday匹配,假定Text中的K字符的位置为:当前偏移量+Pattern字符串长度+1 提高查找速度
	 */
	public boolean sundayMatchBool(String sourceString, String patternString) {
		// // Covert the char array
		// char[] sourceList = sourceString.toCharArray();
		// char[] patternList = patternString.toCharArray();

		int sourceLength = sourceString.length();
		int patternLength = patternString.length();
		// System.out.println(sourceLength + " " + patternLength);
		int sCount = 0, pCount = 0;
		// int loc = 0;

		if (sourceLength < patternLength) {
			return false;
		}

		while (sCount < sourceLength && pCount < patternLength) {
			// if equals to move next character
			if (sourceString.charAt(sCount) == patternString.charAt(pCount)) {
				sCount++;
				pCount++;
			} else {
				// sAim:the location of char to judge
				// pAim:the last location of the pattern string
				int sAim = sCount + patternLength;
				if (sAim > sourceLength) {
					return false;
				}
				char aimChar = sourceString.charAt(sAim);
				int pAim = patternLength - 1;
				// to judge char from back to front,the pAim is the equal
				// location
				while (pAim > 0) {
					if (patternString.charAt(pAim) == aimChar) {
						break;
					}
					pAim--;
				}
				// record the equal location with loc.
				// sCount:move the judge location of source string
				// pCount:move the begin of the pattern string
				sCount = sCount + patternLength - pAim;
				// loc = sCount;
				pCount = 0;
			}
		}
		// if pattern string don't match completed,return -1
		if (pCount < patternLength) {
			return false;
		}
		// else return the location
		return true;
	}
}


你可能感兴趣的:(字符串模式匹配sunday算法)