zoukankan      html  css  js  c++  java
  • 动态规划之最大公共子串算法代码实现(使用JavaScript实现)

    问题描述

    最大公共子串问题:要求在两个字符串之间找出最大的公共字符串.并且输出其所在位置.通过递推可以分析得出递推公式(博主是跟着学的,没分析) : c[i,j] = c[i-1,j-1] + 1

    以下图示列出了过程.文中的代码使用的是动态规划求解.

    其中可能有点难以理解的是下标问题: arr[i] == 0 arr[j] == 0的情况是需要进行列出来的,并且都是为0.在进行字符对比的时候,按照下标从1开始进行对比.而不是从0开始进行对比.

    图析




    代码实现

            let list_a = ['A', 'B', 'C', 'A', 'D', 'B', 'B'];
            let list_b = ['B', 'C', 'E', 'D', 'B', 'B'];
            local_max = 0; //最大值所处的位置(是表格中的最大值所处的位置)
            extend_max = 0; // 最大值所占的长度
    
            let list_dp = []
    
            for (let i = 0; i <= list_a.length; i++) {
                list_dp[i] = [];
                for (let j = 0; j <= list_b.length; j++) {
                    list_dp[i][j] = 0;
                }
            } // 初始化二维数组 : (默认全部初始化为0)
    
    
            /*
            下面的循环是从1开始的.因为记录各个可能性的动态表的二维数组是多一行与一列的.
            这一行与一列的多出是因为有list-a 或者list_b 等于0个字符串的对比情况.
            */
    
            for (let i = 1; i <= list_a.length; i++) {
                for (let j = 1; j <= list_b.length; j++) {
                    
                    if (list_a[i - 1] === list_b[j - 1]) { // 表格与字符串下标的对应.因为字符串下标是从0开始的
    
                        list_dp[i][j] = list_dp[i - 1][j - 1] + 1; // 递推公式: list_[i][j] = list[i-1][j-1] + 1
    
                        if (list_dp[i][j] > extend_max) {
                            local_max = i;
                            extend_max = list_dp[i][j];
                        }
                    } 
                    // else { // 默认初始化为0.这里就不用再赋值了
                    //     list_dp[i][j] = 0;
                    // }
                }
            }
            console.log(list_dp);
            console.log(local_max); // 表格中的最大值所处的位置
            console.log(local_max-extend_max); // 起始位置
            console.log(extend_max);// 最大值所占用的长度
    




  • 相关阅读:
    jsp 特殊标签
    poj 1753 Flip Game 高斯消元 异或方程组 求最值
    zoj 3155 Street Lamp 高斯消元 异或方程组 求方案数
    poj1222 EXTENDED LIGHTS OUT 高斯消元解异或方程组 模板
    zoj 3930 Dice Notation 模拟
    zoj 3157 Weapon 线段树求逆序对数
    hdu 1242 Rescue BFS+优先队列
    hdu 3466 Proud Merchants 贪心+01背包
    zoj 3689 Digging 贪心+01背包
    hdu 2602 Bone Collector 01背包模板
  • 原文地址:https://www.cnblogs.com/gtscool/p/12617785.html
Copyright © 2011-2022 走看看