zoukankan      html  css  js  c++  java
  • 串的模式匹配算法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).

  • 相关阅读:
    网站性能在线评估
    如何测试电梯/伞/桌子/笔?
    apk反编译查看源码
    Jmeter(四)-断言/检查点
    【转】Jmeter(三)-简单的HTTP请求(非录制)
    【转】Jmeter(二)-使用代理录制脚本
    [转]Jmeter(一)-精简测试脚本
    CentOS 安装以及配置Apache php mysql
    centOS静态ip设置
    免费DDOS攻击测试工具大合集
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181470.html
Copyright © 2011-2022 走看看