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日

相关文章

  • Javascript Date getDate() 方法

    以下是关于JavaScript Date对象的getDate()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的getDate()方法 JavaScript Date对象的getDate()方法返回一个月中的某一天(1-31)。该方法可用于获取当前日期的天数。 下是使用Date对象的getDate()方法的示例: var date =…

    JavaScript 2023年5月11日
    00
  • 定时器(setTimeout/setInterval)调用带参函数失效解决方法

    当我们在使用JavaScript中的定时器(setTimeout/setInterval)调用带参的函数时,有时候就会遇到传递参数失败或丢失的问题。本篇攻略将会详细介绍这个问题的解决方法。 问题描述 在使用定时器调用带参函数时,经常会遇到该函数中的参数传递失败的情况。比如,下面的代码: setTimeout(myFunc(param1), 1000); 在1…

    JavaScript 2023年6月11日
    00
  • JS保存和删除cookie操作 判断cookie是否存在

    下面是JS保存和删除cookie操作以及判断cookie是否存在的完整攻略。 保存cookie 在JS中,保存cookie需要使用document.cookie属性,并将需要保存的键值对以字符串的形式传递给该属性。具体操作步骤如下: 根据需要创建需要保存的键值对。 将键值对以字符串的形式传递给document.cookie属性。 示例如下: // 创建需要保…

    JavaScript 2023年6月11日
    00
  • ES6基础知识介绍

    下面是关于“ES6基础知识介绍”的完整攻略。 1. ES6是什么 ES6,全称是ECMAScript 6,又称ES2015,是JavaScript语言的新一代标准,是第一次对JavaScript语言本身的修改和完善,它不仅增加了很多新特性,还对语言本身进行了全面升级。ES6的各种新特性和语法糖,可以让我们用更少的代码,更简单地完成一些复杂的任务。 2. ES…

    JavaScript 2023年6月10日
    00
  • 纯js模仿windows系统日历

    下面是详细的“纯js模仿windows系统日历”的攻略。 确定需求 在开始实现之前,我们需要明确我们要实现的功能和样式。通过分析windows系统日历,我们需要实现以下功能:展示年、月、日;选择日期;展示节日;展示农历等。 确定技术栈 由于需要实现前端交互和展示,我们可以选用纯js实现,同时可以使用第三方库例如moment.js或day.js来处理日期以及节…

    JavaScript 2023年5月27日
    00
  • JS面向对象编程——ES6 中class的继承用法详解

    JS面向对象编程——ES6 中class的继承用法详解 1. ES6中的class ES6中引入了class关键字,使得JS中的面向对象编程更为易用和易读。class语法基于原型继承实现,更加直观和易于理解,在编写复杂程序时更为方便。 下面是一个class的示例代码: class Person { constructor(name, age) { this.…

    JavaScript 2023年5月27日
    00
  • JavaScript数组前面插入元素的方法

    JavaScript 数组前面插入元素有多种方法,下面详细讲解一下。 使用unshift()方法 unshift() 方法可向数组的开头添加一个或多个元素,并返回新的长度。语法如下: array.unshift(element1, …, elementN) 例如,我们有一个数组 fruits,它包含了 “Banana” 和 “Orange” 两个元素: …

    JavaScript 2023年5月27日
    00
  • 一些常用的JS功能函数(2009-06-04更新)

    一些常用的JS功能函数是一篇介绍常用JS函数的文章,内容涵盖了字符串操作、数组操作、日期操作、基本算法等方面。本文将结合实例进行详细讲解。 字符串操作函数 字符串去首尾空格函数 trim() 这个函数可以去除字符串头尾的空格,使得字符串更加统一。 示例: let str = ‘ hello world! ‘; str = str.trim(); consol…

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