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

yizhihongxing

下面是关于“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日

相关文章

  • jQuery中 DOM节点操作方法大全

    jQuery中 DOM节点操作方法大全 在jQuery中,DOM节点操作是非常常见和重要的,本文将会介绍jQuery中常用的DOM节点操作方法,包括增删改查等操作。 一、添加节点操作 append和appendTo append:向元素内部的最后面添加新的元素 appendTo:将新的元素添加到现有元素的内部的最后面 示例代码如下: // 在id为test的…

    JavaScript 2023年6月10日
    00
  • JS加载解析Markdown文档过程详解

    以下是详细的攻略,在此过程中,假设使用的是原生JS,没有使用任何外部库: 1. 获取Markdown文档内容 要加载Markdown文档,我们首先需要获取文件内容。可以使用XMLHttpRequest对象进行同步或异步的文件读取。这里我们以异步的方式读取Markdown文件。 function loadMarkdownFile(url, callback) …

    JavaScript 2023年5月27日
    00
  • Html5页面内使用JSON动画的实现

    下面我将详细讲解HTML5页面内使用JSON动画的实现攻略,包括以下内容: 前置技能要求 JSON动画的实现步骤 示例说明 前置技能要求 在学习JSON动画实现之前,建议您掌握以下技能: HTML/CSS基础 JavaScript基础 JSON格式的理解及使用 JSON动画的实现步骤 以下为HTML5页面内使用JSON动画实现的步骤: 首先,在HTML文件中…

    JavaScript 2023年5月27日
    00
  • 最简单的JS实现json转csv的方法

    让我们来详细讲解“最简单的JS实现json转csv的方法”的完整攻略。 1. 概述 CSV指的是“逗号分隔值(Comma-Separated Values)”,是一种电子表格或数据库管理系统中的一种文件格式。我们通常会使用CSV格式来处理大量数据,并且将其导入到Excel等软件中以进行处理和分析。而JSON(JavaScript Object Notatio…

    JavaScript 2023年5月27日
    00
  • js调试系列 初识控制台

    JS调试系列——初识控制台 什么是控制台 控制台是浏览器提供的调试工具,可以用来查看JavaScript代码的运行情况,如代码执行顺序,变量的值等。控制台可以输出信息,查看调用堆栈,进行代码地图等操作。Chrome浏览器的控制台是最为强大的。 打开控制台 在Chrome浏览器中,可以通过快捷键 Ctrl + Shift + J 打开控制台。也可以右键页面空白…

    JavaScript 2023年5月27日
    00
  • js获取时间函数及扩展函数的方法

    获取当前时间是 JavaScript 常见的操作之一,可以通过内置的 Date 对象的方法来实现。在这里,我将为大家介绍如何使用 JavaScript 来获取时间和日期,并通过扩展函数自定义时间格式等操作。 一、JavaScript 获取时间函数 JavaScript 内置 Date 对象提供了一系列可用于获取时间的方法。下面是常用的方法: 1. 获取当前时…

    JavaScript 2023年5月27日
    00
  • 35个JS中实用工具函数的代码分享

    标题:35个JS中实用工具函数的代码分享 介绍 本文将分享35个JS中实用工具函数的代码。这些函数可以被应用于日常开发中,提高开发和编码效率。在下面的内容中,每个函数均附带代码示例,帮助读者更好地理解和应用它们。 代码分享 函数 1:isArray 判断变量是否为数组。 function isArray (arr) { return Object.proto…

    JavaScript 2023年5月27日
    00
  • vscode 一键规范代码格式的实现

    下面我将为大家讲解“vscode 一键规范代码格式的实现”的完整攻略。 1. 安装插件 要实现一键规范代码格式,需要安装 vscode 的插件 Prettier – Code formatter,可以通过在 vscode 中按下快捷键 Ctrl + Shift + X 打开插件商店,在搜索框中输入 Prettier,然后点击安装即可。 2. 配置插件 在 v…

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