当前位置: 首页 > news >正文

字符串匹配算法

/**
 * KMP算法用来处理字符串匹配问题
 * 原理介绍:找到匹配失败时的最合适的回退位置,而不是简单的回退到子串的第一个字符(常规的枚举查找方式,是简单的回退到子串的第一个字符),即可提高查找的效率.
 * 因此为了找到这个合适的位置,先对子串预处理,从而得到一个回退位置的数组.
 *
 */
public class KMP {
	/**
	  * 对子串加以预处理,从而找到匹配失败时子串回退的位置,此过程是子串的自我匹配过程,类似于KMP过程
	  * @return
	  */
	 public static int[] preProcess(char [] B) {
	  int size = B.length;
	  int[] P = new int[size];
	  P[0]=0;
	  int j=0;
	  //每循环一次,就会找到子串第i个字符匹配失败时,子串的一个回退位置
	  for(int i=1;i<size;i++){
		   while(j>0 && B[j]!=B[i]){
		    j=P[j];
		   }
		   //只有当子串中含有重复字符时,回退的位置才会被优化
		   if(B[j]==B[i]){
		    j++;
		   }
		   //找到一个回退位置j,把其放入P[i]中
		   P[i]=j;
	  }
	  return P;
	 }
	 
	 /**
	  * KMP实现
	  */
	 public static void kmp(String parStr, String subStr) {
	  int subSize = subStr.length();
	  int parSize = parStr.length();
	  char[] B = subStr.toCharArray();
	  char[] A = parStr.toCharArray();
	  int[] P = preProcess(B);
	  int j=0;
	  int k =0;
	  for(int i=0;i<parSize;i++){
		  //当子串的第j个字符(B[j])不等于源串的第i个字符(A[i])时,对B字符串进行回退,回退到A[i-j+ 1..i]与B[1..j]相等
		  while(j>0 && B[j]!=A[i]){
		   //找到合适的回退位置
			  j=P[j-1];
		  }
		  //当子串的第j个字符(B[j])匹配源串的第i个字符(A[i])时,j加1
		  if(B[j]==A[i]){
			  j++;
		  }
		  //输出匹配结果,并且让比较继续下去
		  if(j==subSize){
			  j=P[j-1];
			  k++;
			  System.out.printf("Find subString '%s' at %d\n",subStr,i-subSize+1);
		  }
	  }
	  System.out.printf("Totally found %d times for '%s'.\n\n",k,subStr);
	 }
	public static void main(String[] args) {
		  kmp("abcdeg, abcdeh, abcdef","abcdef");
		  //回退位置数组为P[0, 0, 1, 2, 3, 4]
		  kmp("Test ititi ititit! Test ititit","ititit");

	}
}


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CXF:根据werservice代码生成WSDL(转)
  • 位运算的应用和实例
  • 深入理解css3中 nth-child 和 nth-of-type 的区别
  • 求最大公约数和最小公倍数
  • 方案撰写注意事项
  • Linux 常用命令使用方法大搜刮
  • 应用Hash函数(java描述)
  • 用java实现生产者和消费者问题
  • 【转】AngularJS 日期格式化 字典
  • Struts的线程安全问题
  • JSP中的pageEncoding和contentType的区别
  • 2016-wing的年度总结
  • java中split() replace() replaceAll()三个函数分析
  • SPOJ-COLONY - Linearian Colony!简单二分思想
  • msfconsole 控制台使用和操作
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • CSS居中完全指南——构建CSS居中决策树
  • k个最大的数及变种小结
  • Next.js之基础概念(二)
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从0到1:PostCSS 插件开发最佳实践
  • 关于 Cirru Editor 存储格式
  • 前端技术周刊 2019-02-11 Serverless
  • 日剧·日综资源集合(建议收藏)
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 设计模式 开闭原则
  • 无服务器化是企业 IT 架构的未来吗?
  • 详解NodeJs流之一
  • 学习ES6 变量的解构赋值
  • 用jquery写贪吃蛇
  • 智能合约Solidity教程-事件和日志(一)
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • !!Dom4j 学习笔记
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #Lua:Lua调用C++生成的DLL库
  • (11)MATLAB PCA+SVM 人脸识别
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)测试工具
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (利用IDEA+Maven)定制属于自己的jar包
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四)进入MySQL 【事务】
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)80c52学习之旅-起始篇
  • (转)创业家杂志:UCWEB天使第一步
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET C# 操作Neo4j图数据库
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • @FeignClient注解,fallback和fallbackFactory