• 串的模式匹配算法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).

  • 相关阅读:
    JS基本概念 -- 操作符 -- 布尔操作符
    JS基本概念 -- 操作符 -- 一元操作符
    JS基本概念 -- 数据类型(二)
    JS基本概念 -- 数据类型(一)
    JS基本概念 -- 语法
    使用Browsersync热更新热替换,解放F5
    js中汉字utf8编码互相转换
    npm 使用代理 install 插件
    时间戳转换成yyyy-mm-dd
    Backbone.View.extend之后的构造函数实例化经历了一些什么处理
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181470.html
Copyright © 2020-2023  润新知