function getDifference(a, b)
{
var i = 0;
var j = 0;
var result = "";
while (j < b.length)
{
if (a[i] != b[j] || i == a.length)
result += b[j];
else
i++;
j++;
}
return result;
}
console.log(getDifference("lebronjames", "lebronnjames"));
function findDifference(s, t) {
if(s === '') return t;
// this is useless and can be omitted.
for(let i = 0; i < t.length; i++) {
if(!s.split('').includes(t[i])) {
return t[i];
}
}
// this is useless and can be omitted.
// (if the additional letter exists)
// cache them, count values, different values of the same letter would give the answer.
const obj_S = {};
const obj_T = {};
for(let i = 0; i < s.length; i++) {
if(!obj_S[s[i]]) {
obj_S[s[i]] = 1;
}else {
obj_S[s[i]]++;
}
}
for(let i = 0; i < t.length; i++) {
if(!obj_T[t[i]]) {
obj_T[t[i]] = 1;
}else {
obj_T[t[i]]++;
}
}
for(const key in obj_T) {
if(obj_T[key] !== obj_S[key]) {
return key
}
}
}
// if more than 1 letter -> store the values and the return, logic stays the same.
console.log(findDifference('john', 'johny')) // --> y
console.log(findDifference('bbcc', 'bbbcc')) //--> b
7条答案
按热度按时间kxkpmulp1#
另一个选择,对于更复杂的差异检查,是利用PatienceDiff算法。我将此算法移植到Javascript中。
https://github.com/jonTrent/PatienceDiff
虽然该算法通常用于文本的逐行比较(如计算机程序),但它仍然可以用于逐字符比较。例如,要比较两个字符串,您可以执行以下操作...
...其中
difference.lines
被设置为具有比较结果的数组...aIndex === -1
或bIndex === -1
表示两个字符串之间的差异。具体来说...b
的位置3中找到字符““。a
中的位置9中找到字符“n”。b
中的位置10找到字符““。a
中找到字符“i”。b
中找到字符“e”。a
中的位置15处找到字符“t”。请注意,PatienceDiff算法对于比较两个相似的文本或字符串块非常有用。它不会告诉您是否发生了基本编辑。例如,以下...
...返回
difference.lines
,其中包含...请注意,PatienceDiff并不报告名字和姓氏的交换,而是提供一个结果,显示从
a
中删除了哪些字符,以及向b
添加了哪些字符,最终得到b
的结果。编辑:新增算法 patienceDiffPlus。
在仔细考虑了上面提供的最后一个例子后,显示了PatienceDiff在识别可能移动的行方面的局限性,我突然意识到,有一种优雅的方法可以使用PatienceDiff算法来确定是否有任何行确实可能移动,而不仅仅是显示删除和添加。
简而言之,我添加了
patienceDiffPlus
算法js文件的底部。patienceDiffPlus
算法从初始patienceDiff
算法中获取删除的aLines[]和添加的bLines[],并再次通过patienceDiff
算法运行它们。即,patienceDiffPlus
正在寻找可能移动的行的最长公共子序列,因此它将其记录在原始patienceDiff
结果中。patienceDiffPlus
算法将继续此操作,直到没有找到更多移动的行。现在,使用
patienceDiffPlus
,下面的比较......返回
difference.lines
,其中包含...请注意添加的
moved
属性,它标识行(或本例中的字符)是否可能被移动。同样,patienceDiffPlus
只是匹配删除的aLines[]和添加的bLines[],因此不能保证行确实被移动,但很有可能它们确实被移动了。qvtsj1bj2#
这将返回两个字符串之间的第一个差值
例如
lebronjames
和lebronnjames
是n
qnzebej03#
l2osamch4#
对于那些想要返回两个字符串之间的第一个差异的人,可以像这样调整它:
排序查找
添加CharCode
ryevplcw5#
实际上,第一部分可以省略(第一个for循环)我对边缘情况的解决方案解决了整个问题,因为如果值不存在,它将是未定义的,并且count!== undefined将返回字母...
mepcadol6#
c9qzyr3d7#
我的方法来获得两个字符串之间的差异。我希望这个函数能帮助一些人: