javascript实现最长公共子序列实例代码

下面是关于“javascript实现最长公共子序列实例代码”的完整攻略。

完整任务说明

本任务要求实现一个javascript代码,用于寻找两个字符串的最长公共子序列。

功能要求

  • 输入两个字符串,比如"abcdfg"和"abdfg",程序需要输出它们的最长公共子序列。
  • 实现的算法需要支持对长度为m和n的字符串进行快速计算,时间复杂度需要为 O(m*n)。

背景知识

  • “最长公共子序列”是指在两个或多个序列中都出现的最长的序列。
  • “子序列”是指在原序列中删去某些元素后得到的序列,不要求元素在子序列中连续。
  • 最长公共子序列是两个字符串的最长公共子序列。

参考实现

下面是一个参考实现,其中使用动态规划的思路实现最长公共子序列。

function longestCommonSubsequence(str1, str2) {
    var m = str1.length;
    var n = str2.length;
    var c = [[]];
    var i, j;
    for (i = 0; i < m; i++) {
        c[i] = [];
        for (j = 0; j < n; j++) {
            if (i === 0 || j === 0) {
                c[i][j] = 0;
            } else if (str1[i - 1] === str2[j - 1]) {
                c[i][j] = c[i - 1][j - 1] + 1;
            } else {
                c[i][j] = Math.max(c[i][j - 1], c[i - 1][j]);
            }
        }
    }
    var s = "";
    i = m - 1;
    j = n - 1;
    while (i >= 0 && j >= 0) {
        if (str1[i - 1] === str2[j - 1]) {
            s = str1[i - 1] + s;
            i--;
            j--;
        } else if (c[i][j - 1] > c[i - 1][j]) {
            j--;
        } else {
            i--;
        }
    }
    return s;
}

这个实现中,首先根据输入的两个字符串分别计算出它们的长度m和n。然后,创建一个空的数组c,用于记录在两个字符串的不同长度前缀中,最长公共子序列的长度。这个数组的初始化需要用到循环,从0开始遍历。

接下来,再次循环,代码将通过比较str1[i - 1]和str2[j - 1]判断两个字符串当前位置的元素是否相同。如果相同,它就会在c[i - 1][j - 1]的基础上加1; 如果不同,则要在c[i][j - 1]和c[i - 1][j]中选择最大值,作为c[i][j]的值。

最后,代码将使用一个while循环来跟踪最长公共子序列。该while循环从右下角(即最后一个数)开始追踪回溯过程。 如果str1[i - 1]和str2[j - 1]相同,则将它们追加到最长公共子序列中并向左上方移动一步。 如果c[i][j - 1]>c[i - 1][j],则向左移动;否则向上移动。

示例

例如,输入字符串为"abcdfg"和"abdfg",它们的最长公共子序列为"abdg"。

longestCommonSubsequence("abcdfg", "abdfg");   // 返回:"abdg"

另一个例子是,输入字符串为"abcdefghi"和"befhdbagi",它们的最长公共子序列为"ebag"。

longestCommonSubsequence("abcdefghi", "befhdbagi"); // 返回:"ebag"

以上就是针对“javascript实现最长公共子序列实例代码”的详细攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript实现最长公共子序列实例代码 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JS中URL.createObjectURL使用示例讲解

    JS中URL.createObjectURL使用示例讲解 什么是URL.createObjectURL? 在JavaScript中,URL.createObjectURL() 是一种方便的方法,可以将 Blob 或 文件对象转换为一个URL字符串,用于引用和使用。 URL.createObjectURL的语法 objectURL = URL.createOb…

    JavaScript 2023年5月27日
    00
  • 正则表达式RegExp语法与用法详解

    正则表达式RegExp语法与用法详解 什么是正则表达式? 正则表达式是一种通用的字符匹配模式,可以用来进行字符串的查找替换、格式验证等操作。在许多编程语言中都具有很重要的地位。 正则表达式定义 一个正则表达式是由普通字符(例如字符 a 到 z )以及特殊字符(称为元字符)组成的文字模式。模式描述了要匹配的字符类型或顺序。 在JavaScript中,使用Reg…

    JavaScript 2023年6月10日
    00
  • JS实现使用POST方式发送请求

    JS实现使用POST方式发送请求的步骤如下: 创建一个XMLHttpRequest对象 在发送POST请求之前,需要先创建一个XMLHttpRequest对象。可以使用以下代码创建: let xhr = new XMLHttpRequest(); 设置请求的处理函数 在发送实际的请求之前,需要先设置请求的处理函数。这些函数在请求的不同阶段会被自动调用。可以使…

    JavaScript 2023年5月27日
    00
  • 原生js实现简单轮播图效果

    下面我来详细讲解如何用原生JS实现简单轮播图效果。 步骤1:HTML结构 我们首先需要在HTML文件中创建轮播图的骨架,通常可以使用<ul>标签和若干个<li>标签来实现。例如: <div id="slider"> <ul> <li><img src="slide…

    JavaScript 2023年6月11日
    00
  • JQuery中的$.getJSON 使用说明

    以下是关于JQuery中的$.getJSON()使用说明的完整攻略: 1. 概述 $.getJSON()是JQuery中用来发送JSON格式请求并获取响应结果的函数。其基本用法为:$.getJSON(url, [data], [success])。 其中,url表示数据请求的url,data是可选的请求参数,success是请求成功后的回调函数。 2. 示例…

    JavaScript 2023年5月27日
    00
  • JavaScript数组去重的几种方法详谈

    当我们需要去除 JavaScript 数组中的重复元素时,可以采用以下几种方法: 方法1:使用 Set 首先我们可以利用 Set 去重,因为 Set 只存储不重复的值,可以将一个数组转换为 Set 集合,再将 Set 集合转换为数组,就可以实现去重。具体代码如下: let arr = [1, 2, 3, 3, 4, 4, 5]; let set = new …

    JavaScript 2023年5月27日
    00
  • 你真的了解BOM中的history对象吗

    当涉及到浏览器对象模型(BOM)时,常用的对象之一就是history对象。 这个对象允许我们访问正在打开并已经关闭的浏览器窗口的历史记录。 1. history对象简介 history对象是浏览器的窗口历史记录, 它是Window对象中的一个属性,可以使用window.history属性来访问它。history对象包含用户在浏览器中访问的所有页面的历史记录,…

    JavaScript 2023年6月11日
    00
  • 小程序tab页无法传递参数的方法

    小程序tab页无法传递参数是因为tab页在切换时不会重新加载,也就无法获取新的参数。解决这个问题的方法有多种,下面将提供两条示例说明。 方法1:使用全局变量传参 在小程序的app.js文件中定义一个全局变量globalData,用于存储需要传递的参数,然后在tab页的onLoad生命周期函数中获取这个参数即可。 代码示例: // app.js App({ g…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部