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

 更新时间:2017年01月23日 14:07:54   作者:min.jiang  
本文主要介绍了计算两个字符串最大公有子串的解决方案。具有很好的参考价值,下面跟着小编一起来看下吧

背景

对算法一直应用的比较少,最近看到一些典型的算法想练练手,想看看到底有多么让人讨厌。其实发现算法都有一定的套路,一般并不是临时凭空想出来的,大都建立在一些已经存在的经典算法知识以及数据结构上。换句话来说,如果某些玩法之前未接触过,那么让你在短时间内临时想出来还是有一定难度的。这有点类似项目经验,如果曾经做过一个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方案就需要考虑效率了。

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

相关文章

  • Java内存泄漏问题排查与解决

    Java内存泄漏问题排查与解决

    大家好,本篇文章主要讲的是Java内存泄漏问题排查与解决,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 详谈Java 异常处理的误区和经验总结(分享)

    详谈Java 异常处理的误区和经验总结(分享)

    下面小编就为大家分享一篇Java 异常处理的误区和经验总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java中ArrayIndexOutOfBoundsException 异常报错的解决方案

    Java中ArrayIndexOutOfBoundsException 异常报错的解决方案

    本文主要介绍了Java中ArrayIndexOutOfBoundsException 异常报错的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java创建多线程局域网聊天室实例

    Java创建多线程局域网聊天室实例

    这篇文章主要介绍了Java创建多线程局域网聊天室实例,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Java的方法和this关键字如何理解与应用

    Java的方法和this关键字如何理解与应用

    Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function)。对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号{}当中,并且起一个名字。使用代码的时候,直接找到名字调用即可
    2021-10-10
  • Java可以如何实现文件变动的监听的示例

    Java可以如何实现文件变动的监听的示例

    本篇文章主要介绍了Java可以如何实现文件变动的监听的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • 简单了解Java类成员初始化顺序

    简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • HashSet底层竟然是HashMap实现问题

    HashSet底层竟然是HashMap实现问题

    这篇文章主要介绍了HashSet底层竟然是HashMap实现问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java基础之垃圾回收机制详解

    Java基础之垃圾回收机制详解

    这篇文章主要介绍了Java基础之垃圾回收机制详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • IntelliJ IDEA 2020.2 全家桶及以下版本激活工具大全【喜讯】

    IntelliJ IDEA 2020.2 全家桶及以下版本激活工具大全【喜讯】

    这篇文章主要介绍了IntelliJ IDEA 2020.2 全家桶及以下版本激活工具大全【喜讯】,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09

最新评论