全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

计算两个字符串最大公有子串

背景

对算法一直应用的比较少,最近看到一些典型的算法想练练手,想看看到底有多么让人讨厌。其实发现算法都有一定的套路,一般并不是临时凭空想出来的,大都建立在一些已经存在的经典算法知识以及数据结构上。换句话来说,如果某些玩法之前未接触过,那么让你在短时间内临时想出来还是有一定难度的。这有点类似项目经验,如果曾经做过一个CRM系统,下次再碰到它时你就轻松很多,如果你挑战的是一个你从未遇到过的系统,你只能凭已有知识去强吃。

计算两个字符串最大公共子串

这个也是经常遇到到,给出两个任意长度的字符串,输出最大公有字符串,比如输入abcdef,cdef,则输出cdef。

解决方案

采用双层循环,指针移动来记录所有子串,最后取最大长度子串。利用临时队列来存储循环过程中匹配成功的字符元素,从两个字符串首个元素开始匹配。

  • 如果a.charAt(i)=b.charAt(j),标记开始匹配,同时移动两者指针,并将相同字符串压入临时队列中
  • 如果a.charAt(i)!=b.charAt(j),只移动b的指针。如果处于匹配中,则将临时队列存储到结果集中,并清空临时队列。
  • 如果a,b任意一个到了最后一个元素,将临时队列中的值存储到结果集中,并清空临时队列

示意图

从元素0开始比较

字符串A指针不动,B依次向后找至少找到相同的,将相同字符压入临时队列中。

出现第一个匹配元素

当出现匹配元素后,两个字符串均向后移动一个元素再做比较。

匹配出现中断

如果前面已经开始匹配成功,向后出现字符不相同时,终止。

重置索引,循环匹配

字符串B指针向后移动,字符串A的指针重置,递归上面的步骤。

示例代码

下面的示例将所有子串均记录下来,如果只想输出最大子串需要改下逻辑,定义一个最大子串,然后与循环计算的子串相比较,取两者长度最大值即可。

String b="abcdeqwe";
String a="cdeabrwqedeqwe";
int lengthA=a.length();
int lengthB=b.length();
//标识是否开始匹配
boolean match=false;
//循环中用于存储相同字符的临时队列
Queue tmpResult=new ArrayQueue();
//存储所有子串
List<Queue> result=new ArrayList<>();
for(int i=0;i<lengthA;i++){
 int indexA=i;
 for(int j=0;j<lengthB;j++){
  if(a.charAt(indexA)==b.charAt(j)){
   if(!match) {
    match = true;
   }
   tmpResult.add(a.charAt(indexA));
   if(indexA<lengthA-1) {
    indexA++;
   }
  }
  else {
   if(match) {
    result.add(tmpResult);
    //重置条件
    tmpResult=new ArrayQueue();
    indexA=i;
   }
  }
  if(j==lengthB-1||i==lengthA-1){
   if(!tmpResult.isEmpty()){
    result.add(tmpResult);
    //重置条件
    tmpResult=new ArrayQueue();
   }
  }
 }
}
//取最大的子串
Queue stringResult= Collections.max(result, new Ordering<Queue>() {
 @Override
 public int compare(Queue left, Queue right) {
  return Integer.compare(left.size(),right.size());
 }
});

优点

指针移动在循环过程中不会产生多余的临时字符串,如果是substring方案就需要考虑效率了。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# 计算  # 字符串  # C语言中计算字符串长度与分割字符串的方法  # C#计算字符串哈希值(MD5、SHA)的方法小结  # Lua中计算、执行字符串中Lua代码的方法  # Shell脚本计算字符串长度和判断字符串为空小技巧  # Lua判断字符串中包含中文字符的方法和计算字符串宽度函数分享  # JavaScript实现计算字符串中出现次数最多的字符和出现的次数  # 利用PHP函数计算中英文字符串长度的方法  # PHP改进计算字符串相似度的函数similar_text()、levenshtein()  # JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)  # C#和SQL实现的字符串相似度计算代码分享  # 有一定  # 想出  # 递归  # 清空  # 过程中  # 的是  # 如果你  # 让人  # 第一个  # 你就  # 已有  # 时间内  # 数据结构  # 不动  # 并将  # 做过  # 只想  # 已经开始  # 想看  # 句话 


相关文章: 网站好制作吗知乎,网站开发好学吗?有什么技巧?  大连网站设计制作招聘信息,大连投诉网站有哪些?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何做网站制作流程,*游戏网站怎么搭建?  建站之星后台管理系统如何操作?  建站之星安装步骤有哪些常见问题?  如何在景安云服务器上绑定域名并配置虚拟主机?  创业网站制作流程,创业网站可靠吗?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  建站主机默认首页配置指南:核心功能与访问路径优化  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何确保西部建站助手FTP传输的安全性?  定制建站价位费用解析与套餐推荐全攻略  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  如何高效搭建专业期货交易平台网站?  如何在自有机房高效搭建专业网站?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何在建站主机中优化服务器配置?  如何通过山东自助建站平台快速注册域名?  黑客如何通过漏洞一步步攻陷网站服务器?  网站制作免费,什么网站能看正片电影?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何用免费手机建站系统零基础打造专业网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  网站制作难吗安全吗,做一个网站需要多久时间?  如何用已有域名快速搭建网站?  建站之星云端配置指南:模板选择与SEO优化一键生成  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何规划企业建站流程的关键步骤?  如何在IIS中新建站点并配置端口与物理路径?  如何选择适合PHP云建站的开源框架?  如何选择PHP开源工具快速搭建网站?  如何通过虚拟主机快速完成网站搭建?  Bpmn 2.0的XML文件怎么画流程图  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何通过智能用户系统一键生成高效建站方案?  教学网站制作软件,学习*后期制作的网站有哪些?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  宁波自助建站系统如何快速打造专业企业网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  微信推文制作网站有哪些,怎么做微信推文,急?  平台云上自主建站:模板化设计与智能工具打造高效网站  北京制作网站的公司,北京铁路集团官方网站?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  视频网站制作教程,怎么样制作优酷网的小视频? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。