全网整合营销服务商

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

免费咨询热线: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实现的字符串相似度计算代码分享  # 有一定  # 想出  # 递归  # 清空  # 过程中  # 的是  # 如果你  # 让人  # 第一个  # 你就  # 已有  # 时间内  # 数据结构  # 不动  # 并将  # 做过  # 只想  # 已经开始  # 想看  # 句话 


相关文章: 开封网站制作公司,网络用语开封是什么意思?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  免费网站制作appp,免费制作app哪个平台好?  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何选购建站域名与空间?自助平台全解析  定制建站价位费用解析与套餐推荐全攻略  如何快速搭建高效香港服务器网站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  建站之星如何助力企业快速打造五合一网站?  如何通过FTP服务器快速搭建网站?  如何快速使用云服务器搭建个人网站?  建站之星与建站宝盒如何选择最佳方案?  建站主机无法访问?如何排查域名与服务器问题  如何通过虚拟主机空间快速建站?  大同网页,大同瑞慈医院官网?  Swift开发中switch语句值绑定模式  如何在阿里云香港服务器快速搭建网站?  建站之星logo尺寸如何设置最合适?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  大连 网站制作,大连天途有线官网?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何通过VPS建站实现广告与增值服务盈利?  如何续费美橙建站之星域名及服务?  建站之星免费模板:自助建站系统与智能响应式一键生成  如何在橙子建站上传落地页?操作指南详解  高端云建站费用究竟需要多少预算?  如何通过山东自助建站平台快速注册域名?  怎么将XML数据可视化 D3.js加载XML  建站之星展会模板:智能建站与自助搭建高效解决方案  如何选择PHP开源工具快速搭建网站?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  如何快速生成ASP一键建站模板并优化安全性?  如何做网站制作流程,*游戏网站怎么搭建?  Java解压缩zip - 解压缩多个文件或文件夹实例  宁波免费建站如何选择可靠模板与平台?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  高防服务器租用如何选择配置与防御等级?  焦点电影公司作品,电影焦点结局是什么?  文字头像制作网站推荐软件,醒图能自动配文字吗?  建站之家VIP精选网站模板与SEO优化教程整合指南  如何通过wdcp面板快速创建网站?  python的本地网站制作,如何创建本地站点?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何挑选高效建站主机与优质域名?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  建站之星后台管理:高效配置与模板优化提升用户体验  建站之星后台管理系统如何操作? 

您的项目需求

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