JavaScript求最大公共子串的方法详解

本文主要和大家介绍javascript实现求最大公共子串的方法,涉及javascript针对字符串的遍历、匹配、运算等相关操作技巧,需要的朋友可以参考下,希望能帮助到大家。

求最大公共子串,常见的做法是使用矩阵。假设有字符串:abcdefg和字符串abcd,则可构成如下表所示矩阵。

abcdefga1000000b0100000c0010000d0001000

对两个字符串的每一项都进行比较,若匹配则该项为1,不匹配则为0。然后求出对角线最长为1的那一段序列,即为最大公共子串。看上面的分开,似乎得使用二维数组了,在两个字符串都较大的情况下不是很划算,是否可以进一步优化?

可以,需要改变一下策略,如果该项匹配,则该项的值为再设为1,而是其对角线a[i-1, j-1](i > 1 && j > 1)的值+1,这样便可以只使用一个一维数组。

以一个字符串作为“行”,另一个作为“列”,比较两个字符串各项的值,用另外一个变量记录数组的最大值和字符串的起始位置。代码如下:

立即学习“Java免费学习笔记(深入)”;

function LCS(str1, str2) { if (str1 === "" || str2 === "") {  return ""; } var len1 = str1.length; var len2 = str2.length; var a = new Array(len1); var maxLen = 0; var maxPos = 0; for (var i = 0; i = 0; j--) {//列   if (str1.charAt(j) == str2.charAt(i)) {    if (i === 0 || j === 0) {     a[j] = 1;    } else {     a[j] = a[j - 1] + 1;    }   } else {    a[j] = 0;   }   if (a[j] > maxLen) {    maxLen = a[j];    maxPos = j;   }  } } return str1.substr(maxPos - maxLen + 1, maxLen);}

登录后复制

但代码其实并不是最优的,为什么?因为上面的写法必须等待两层循环都完成。有没有相对更快一些的方法呢?

设有字符串a、b,其长度分别为len1、len2,其公共字子串一定是

function findMaxSubStr(s1,s2){ var str= "",  L1=s1.length,  L2=s2.length; if (L1>L2){  var s3=s1;  s1=s2;  s2=s3;  s3 = null;  L1=s2.length;  L2 = s1.length; } for (var i=L1; i > 0; i--) {  for (var j= 0; j = 0) {    return str;   }  } } return "";}

登录后复制

先比较s1、s2的长度,然后取较短的字符串作为。substr(idex, len),所以拿较短的串取其子串,然后判断它是否在较长的字符串中存在,如果存中则直接返回,否则再取下一位。

完整示例:

nbsp;html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  www.jb51.net  body {background-color:#fff;}   function LCS(str1, str2) { if (str1 === "" || str2 === "") { return ""; } var len1 = str1.length; var len2 = str2.length; var a = new Array(len1); var maxLen = 0; var maxPos = 0; for (var i = 0; i = 0; j--) {//列 if (str1.charAt(j) == str2.charAt(i)) { if (i === 0 || j === 0) {  a[j] = 1; } else {  a[j] = a[j - 1] + 1; } } else { a[j] = 0; } if (a[j] > maxLen) { maxLen = a[j]; maxPos = j; } } } return str1.substr(maxPos - maxLen + 1, maxLen);}function findMaxSubStr(s1,s2){ var str= "", L1=s1.length, L2=s2.length; if (L1>L2) { var s3=s1; s1=s2; s2=s3; s3 = null; L1=s2.length; L2 = s1.length; } for (var i=L1; i > 0; i--) { for (var j= 0; j <= L2 - i && j = 0) { return str;  }  } } return "";} !(function() { var tmpArr = []; for (var i = 97; i  0.7;}); var s1 = new Array(600).join(tmpArr.join("")); var date = getNow(); alert( "消耗时间:" + (getNow() - date) + "秒 " + LCS(s1, s2)); date = getNow(); alert( "消耗时间:" + (getNow() - date) + "秒 " + findMaxSubStr(s1, s2) ); })();function getNow() { return new Date().getTime();} 

登录后复制

相关推荐:

详解使用PHP求两个字符串最长公共子串

PHP实现求解最长公共子串思路方法

总结关于公共子串注意点

以上就是JavaScript求最大公共子串的方法详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2787504.html

(0)
上一篇 2025年3月8日 18:08:51
下一篇 2025年2月25日 01:34:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Node.js实现mysql连接池使用事务自动回收连接的方法

    本文主要和大家介绍node.js实现mysql连接池使用事务自动回收连接的方法,结合实例形式分析了node.js操作mysql连接池实现基于事务的连接回收操作相关技巧,需要的朋友可以参考下,希望能帮助到大家。 本文实例讲述了Node.js实…

    编程技术 2025年3月8日
    200
  • js中delete元素和splice元素的区别详解

    本文主要和大家分享js删除数组中的元素delete和splice的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。 例如有一个数组是 :var textArr = [‘a’…

    编程技术 2025年3月8日
    200
  • JS删除数组里的某个元素实例代码

    本文主要为大家分享一篇js删除数组里的某个元素方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。 删除数组指定的某个元素 首先可以给JS的数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引,…

    编程技术 2025年3月8日
    200
  • js中promise实例解析

    大家都知道nodejs很快,为什么会这么快呢,原因就是node采用异步回调的方式来处理需要等待的事件,使得代码会继续往下执行不用在某个地方等待着。但是也有一个不好的地方,当我们有很多回调的时候,比如这个回调执行完需要去执行下个回调,然后接着…

    2025年3月8日
    200
  • JS实现的双色球功能代码分享

    本文主要和大家介绍原生js实现的双色球功能,涉及javascript随机数生成及数值运算相关操作技巧,需要的朋友可以参考下,希望能帮助到大家。 先来看看运行效果: 具体代码如下: nbsp;html>    www.jb51.net …

    2025年3月8日
    200
  • JavaScript中六种错误类型分享

    js中的控制台的报错信息主要分为两大类,第一类是语法错误,这一类错误在预解析的过程中如果遇到,就会导致整个js文件都无法执行。另一类错误统称为异常,这一类的错误会导致在错误出现的那一行之后的代码无法执行,但在那一行之前的代码不会受到影响。 …

    编程技术 2025年3月8日
    200
  • JavaScript实现焦点进入文本框内关闭输入法代码分享

    本文主要和大家分享js实现焦点进入文本框内关闭输入法,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧,希望能帮助到大家。 js实现焦点进入文本框内关闭输入法:imeMode 要用到的东西: imeMode:xxx 有四个参数 …

    编程技术 2025年3月8日
    200
  • JavaScript本地图片预览功能的方法

    本文主要和大家介绍javascript实现图片本地预览功能,针对非ie浏览器的html5滤镜功能及ie浏览器的相关组件功能实现不上传至服务器预览本地图片的效果,需要的朋友可以参考下,希望能帮助到大家。 实现一个在file文件域中选定图片文件…

    2025年3月8日
    200
  • JS实现父子窗口传值功能的代码

    本文主要和大家主要介绍js简单实现父子窗口传值功能,结合具体实例形式分析了javascript实现不使用iframe框架进行窗口之间简单传值的相关操作技巧,需要的朋友可以参考下,希望能帮助到大家。 父窗口页面father.html nbsp…

    编程技术 2025年3月8日
    200
  • vue.js在编写过程中出现空格不规范报错如何解决

    本文主要为大家带来一篇解决vue.js在编写过程中出现空格不规范报错的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 找到build文件夹下面的webpack.base.conf.js…

    2025年3月8日
    200

发表回复

登录后才能评论