如何以最佳方式在兩個字符串之間找到額外字符。查找兩個字符串之間的額外字符
Ex1: S1 - 'abcd', S2 - 'abcxd', output - 'x'
Ex2: S1 - '100001', S2 - '1000011', output - '1'
我們可以通過線性遍歷每個字符爲O(n)比較做到這一點。我想要以更理想的方式做到這一點,比如在O(logn)
如何以最佳方式在兩個字符串之間找到額外字符。查找兩個字符串之間的額外字符
Ex1: S1 - 'abcd', S2 - 'abcxd', output - 'x'
Ex2: S1 - '100001', S2 - '1000011', output - '1'
我們可以通過線性遍歷每個字符爲O(n)比較做到這一點。我想要以更理想的方式做到這一點,比如在O(logn)
基準線方法(O(n)):只比較每個週期兩側的字符和縮小範圍。
function findDiffChar(base, baseExtraChar) {
let extraLastIndex = base.length;
let lastIndex = extraLastIndex - 1;
for (let i = 0; i < extraLastIndex/2; i++) {
console.log(`Loop: ${i}`);
if (base[i] !== baseExtraChar[i])
return baseExtraChar[i];
if (base[lastIndex - i] !== baseExtraChar[extraLastIndex - i])
return baseExtraChar[extraLastIndex - i];
}
return false;
}
console.log(findDiffChar('FOOOOOAR', 'FOOOOOBAR')); // B
使用二進制搜索(O(log n)的)改進的方法:比較兩半,直到你已經將範圍縮小到一個字符。
function findDiffChar(base, baseExtraChar) {
if (baseExtraChar.length === 1) return baseExtraChar.charAt(0);
let halfBaseLen = Number.parseInt(base.length/2) || 1;
let halfBase = base.substring(0,halfBaseLen);
let halfBaseExtra = baseExtraChar.substring(0,halfBaseLen);
return (halfBase !== halfBaseExtra)
? findDiffChar(halfBase, halfBaseExtra)
: findDiffChar(base.substring(halfBaseLen),baseExtraChar.substring(halfBaseLen));
}
console.log(findDiffChar('FOOOOAR', 'FOOOOBAR')); // B
console.log(findDiffChar('---------', '--------X')); // X
console.log(findDiffChar('-----------', '-----X-----')); // X
console.log(findDiffChar('------------', '---X--------')); // X
console.log(findDiffChar('----------', '-X--------')); // X
console.log(findDiffChar('----------', 'X---------')); // X
但這仍然是線性的。 O(n) – user3422229
@ user3422229更新了備用遞歸策略。 – Jecoms
你肯定只有1 XTRA性格嗎? – 2016-12-16 19:13:52
是的。只有1個字符。需要找到那個額外的字符。 – user3422229
雙方攻擊,直到一方不同。或者,你可以讓兩個char數組產生一個新的數組,每個字符的差異結果(使用'charCodeAt()')。第一個非零是差異。 – Jecoms