zoukankan      html  css  js  c++  java
  • 求两个字符串的最大公共串

    算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设成零,最后矩阵中最长的不为零的对角线就是最大子字串。
    例如:

      m a c h i
    a 0 1 0 0 0
    b 0 0 0 0 0
    m 1 0 0 0 0
    a 0 1 0 0 0
    c 0 0 1 0 0




    这样有点问题:建完矩阵还要去找最长对角线,麻烦。
    解决方案是:相等时不只把矩阵元素设为“1”,而是设成它左上角的元素值加一。
    例如:

      m a c h i
    a 0 1 0 0 0
    b 0 0 0 0 0
    m 1 0 0 0 0
    a 0 2 0 0 0
    c 0 0 3 0 0



    所以矩阵建好后,找到矩阵中最大的元素就ok了。

    <script src='jquery.js'></script>
    <meta charset='utf-8'/>
    
    <input id='s1' value='yanhuiabmac'/>
    <input id='s2' value='yanbchuimachi'/>
    <button onclick='calc()'>计算公共串</button>
    
    <table id='out' border=1></table>
    <table id='matrix' border=1></table>
    
    <script>
    function calc() {
        var s1 = $('#s1').val().split('');
        var s2 = $('#s2').val().split('');
        
        // . S 1
        // S - -
        // 2 - -
        var matrix = []; // matrix[row][col]
        
        for (var i = 0; i < s2.length; ++i) {
            matrix[i] = [];
            for (var j = 0; j < s1.length; ++j)
                matrix[i][j] = (s1[j] == s2[i] ?
                            1 + (i != 0 && j != 0 ? matrix[i - 1][j - 1] : 0) :
                            0);                
        }
        
        
        var res = [];
        for (var i in matrix)
            for (var j in matrix[i]) {
                var n = matrix[i][j];
                if (typeof i != 'number') i = parseInt(i, 10);
                if (n) res.push([ s2.slice(i-n+1, i+1).join(''), n ]);
            }
        res.sort();
        res = (function(s){
            var d = [];
            $.each(s, function(i){
                if(i==0 || s[i-1][0] != s[i][0])
                    d.push(s[i]);
            });
            return d;
        })(res);
        res.sort(function(a,b){return b[1]-a[1];});
        res.unshift(['*公共串*', '*长度*']);
        
        matrix.unshift([''].concat(
            (function(a){
                var b = [];
                for (var i in a) b.push('*' + a[i] + '*');
                return b;
            })(s1)));
            
        for (var i = 0; i < s2.length; ++i) matrix[1 + i].unshift('*' + s2[i] + '*');
        
        for (var i = 1; i < matrix.length; ++i)
            for (var j = 1; j < matrix[0].length; ++j)
                if (!matrix[i][j]) matrix[i][j] = '';
        
        
        
        
        
        var m2t = function (m) {
            var s = '';
            for (var i in m) {
                s += '<tr>';
                for (var j in m[i])
                    s += (function(c){
                        var p = 'td';
                        if (c.match(/\*.+\*/)) {
                            c = c.replace(/\*(.+)\*/, '$1');
                            p = 'th';
                        }
                        return '<' + p + '>' + c + '</' + p + '>';
                    })(new String(m[i][j]));
                s += '</tr>';
            }
            return s;
        };
        
        
        
        
        $('#matrix').html(m2t(matrix));
        $('#out').html(m2t(res));
    }
    </script>

  • 相关阅读:
    后缀零
    vs2019 MFC的安装 解决 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。
    矩形切割
    fsync: failed to connect to feed.openvas.org (89.146.224.58)
    How to Install GVM Trial With VMware Workstation Player/Pro
    GVM 21.04 (stable, initial release 20210416)
    gitlab 升级相关
    Adobe Reader XI 11.0.23 简体中文版
    gofileserver GO HTTP 文件下载服务器
    KVM 中安装 Windows 10 虚拟机、CentOS 8 虚拟机及快照操作
  • 原文地址:https://www.cnblogs.com/jt2001/p/151128lcs.html
Copyright © 2011-2022 走看看