如何修改此函数以返回字符串而不是int

时间:2011-07-12 07:55:20

标签: javascript

请快速查看我在网上找到的这个功能。

function longestCommonSubstring(string1, string2){
        // init max value
        var longestCommonSubstring = 0;
        // init 2D array with 0
        var table = Array(string1.length);
        for(a = 0; a <= string1.length; a++){
                table[a] = Array(string2.length);
                for(b = 0; b <= string2.length; b++){
                        table[a][b] = 0;
                }
        }
        // fill table
        for(var i = 0; i < string1.length; i++){
                for(var j = 0; j < string2.length; j++){
                        if(string1[i]==string2[j]){
                                if(table[i][j] == 0){
                                        table[i+1][j+1] = 1;
                                } else {
                                        table[i+1][j+1] = table[i][j] + 1;
                                }
                                if(table[i+1][j+1] > longestCommonSubstring){
                                        longestCommonSubstring = table[i+1][j+1];
                                }
                        } else {
                                table[i+1][j+1] = 0;
                        }
                }
        }
        return longestCommonSubstring;
}

它返回最长公共子字符串的长度作为int。现在我的问题是,是否可以修改这个函数,以便它返回实际的字符串,而不是只返回子字符串的长度,我在编程时很新,并认为只修改这个secetion会有所帮助{{1}但是,这并不容易,因为我不希望在这两个字符串中添加相同的每个字符,只有那些完全相同的字符。 在此先感谢=)

2 个答案:

答案 0 :(得分:0)

您可以将整个公共子字符串存储在表中而不是其长度:

function longestCommonSubstring(string1, string2){
        // init max value
        var longestCommonSubstring = "";
        // init 2D array with 0
        var table = Array(string1.length);
        for(a = 0; a <= string1.length; a++){
                table[a] = Array(string2.length);
                for(b = 0; b <= string2.length; b++){
                        table[a][b] = 0;
                }
        }
        // fill table
        for(var i = 0; i < string1.length; i++){
                for(var j = 0; j < string2.length; j++){
                        if(string1[i]==string2[j]){
                                if(table[i][j] == 0){
                                        table[i+1][j+1] = string1[i];
                                } else {
                                        table[i+1][j+1] = table[i][j] + string1[i];
                                }
                                if(table[i+1][j+1].length > longestCommonSubstring.length){
                                        longestCommonSubstring = table[i+1][j+1];
                                }
                        } else {
                                table[i+1][j+1] = 0;
                        }
                }
        }
        return longestCommonSubstring;
}

答案 1 :(得分:0)

对于现有函数的最小更改,您可以声明一个新变量:

var theCommonString = '';

然后在函数的中间在现有的一行之后添加一行:

longestCommonSubstring = table[i+1][j+1];

表示如下:

theCommonString = string1.substr(i + 1 - longestCommonSubstring,
                                 longestCommonSubstring);

(i + 1指数可能有点偏差,我没有费心去仔细考虑过。)

然后在最后只返回您的新变量而不是现有变量。

请注意,如果有多个相同长度的公共子字符串,则返回最后一个。