串的模式匹配算法1 BF算法

BF算法

字符串的模式匹配不一定要从主串的第一个位置开始,可以指定主串中查找的起始位置 pos。
2. 算法步骤:
1)分别利用计数器指针 i 和 j 指定主串和模式串即小字符串待比较的位置,初始化为 1.
2) 如果两个串均为比较到串尾,就进行以下操作,S[ i ] 和 T[ j ] 进行比较,若相等,指针后移,继续匹配,若不等,指针后退,重新开始匹配。从主串的下一个字符串开始,i = i - j +2;

话不多说,直接上代码

package softcolledge.test;

public class BFTest {

	public static void main(String[] args) {
		String s = "abababc";
		String t = "bab";
		
		if(BF(s,t,1)) {
			System.out.println("匹配成功!");
		}else {
			System.out.println("匹配失败!");
		}

	}
	
	public static boolean BF(String s,String t,int pos) {
		int i = pos,j = 0;
		while(i<s.length() && j<t.length()) { // 两个串均未比较到串味
			if(s.charAt(i)==t.charAt(j)) {
				i++;
				j++;
			}else {
				i = i-j+2; //指针后退重新开始匹配
				j = 1;
			}
		}
		
		if(j>=t.length())
			return true;
		else
			return false;
	}
}

BF算法易于理解,再次要考虑两个极端情况,在最好的情况下,设主串长度为n,子串长度是m,假设主串与模式串比较 i-1 次。也即是第 i 次比较成功了。若第i趟成功比较的字符串次数为 m 则总的次数是 i-1 + m。对于成功匹配的主串,其起始位置由1到 n-m+1 ,最好的情况下平均匹配次数是
1/n-m+1 * (从i=1到 i=n-m+1)求和 i-1+m = 1/2(n+m);在最坏情况下:例如,S=“aaaaaaab”;
T=“ab”; 这时前i-1 趟比较了 (i-1) * m次,因此最坏情况下平均匹配次数是O(n*m).

原文地址:https://www.cnblogs.com/dataoblogs/p/14122009.html