找到两个字符串之间的额外字符

时间:2016-12-16 19:10:42

标签: javascript java string algorithm binary-tree

如何以最佳方式在两个字符串之间找到额外的字符。

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

我们可以通过线性遍历并比较O(n)中的每个字符来实现。我希望以更优化的方式完成这项工作,例如O(logn)

1 个答案:

答案 0 :(得分: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
&#13;
&#13;
&#13;

使用二分搜索的改进方法(O(log n)):比较一半,直到你将它缩小到一个字符。

&#13;
&#13;
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
&#13;
&#13;
&#13;