2016-12-16 152 views
-1

如何以最佳方式在兩個字符串之間找到額外字符。查找兩個字符串之間的額外字符

Ex1: S1 - 'abcd', S2 - 'abcxd', output - 'x' 
Ex2: S1 - '100001', S2 - '1000011', output - '1' 

我們可以通過線性遍歷每個字符爲O(n)比較做到這一點。我想要以更理想的方式做到這一點,比如在O(logn)

+0

你肯定只有1 XTRA性格嗎? – 2016-12-16 19:13:52

+0

是的。只有1個字符。需要找到那個額外的字符。 – user3422229

+1

雙方攻擊,直到一方不同。或者,你可以讓兩個char數組產生一個新的數組,每個字符的差異結果(使用'charCodeAt()')。第一個非零是差異。 – Jecoms

回答

1

基準線方法(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

+0

但這仍然是線性的。 O(n) – user3422229

+0

@ user3422229更新了備用遞歸策略。 – Jecoms

相關問題