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>

  • 相关阅读:
    Java的HashMap
    为什么 char c = 'A';c += 32; 结果输出的是 'a'?
    java中整数的常量优化机制
    IDEA2019版中文汉化包
    asp.net项目协作开发时,常常要忽略版本控制的目录
    SQLServer同步数据到ElasticSearch
    为什么不建议在微信小程序的TarBar上检查统一登录后跳转页面
    nginx的热备方式
    HTTP 和FTP 状态信息总结(留着自己用)
    Web Api 简介
  • 原文地址:https://www.cnblogs.com/jt2001/p/151128lcs.html
Copyright © 2011-2022 走看看