请快速查看我在网上找到的这个功能。
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}但是,这并不容易,因为我不希望在这两个字符串中添加相同的每个字符,只有那些完全相同的字符。 在此先感谢=)
答案 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指数可能有点偏差,我没有费心去仔细考虑过。)
然后在最后只返回您的新变量而不是现有变量。
请注意,如果有多个相同长度的公共子字符串,则返回最后一个。