2011-04-18 18 views

Respuesta

0
function strDiff(first, second) { 
    if(first==second) 
     return -1; 
    first = first.toString(); 
    second = second.toString(); 
    var minLen = min(first.length,second.length); 
    for(var i = 0; i<minLen; i++) { 
     if(first.charAt(i) != second.charAt(i)) { 
      return i; 
     } 
    } 
    return minLen; 
} 

Devuelve -1 si las cadenas no difieren, o el índice (comenzando en 0) de carácter en el que lo hacen (esta es la longitud de la cadena más corta si sólo difieren por ser diferentes longitudes, ej. 'abcd' y 'abcdef' devolverían 4.

1

Tal vez algo así? Devuelve, en ese orden, la posición de la primera diferencia si hay alguna, la longitud de la cadena más corta si esas son diferentes, o -1 si todo es igual.

function findDiff(a, b) { 
    a = a.toString(); 
    b = b.toString(); 
    for (var i = 0; i < Math.min(a.length, b.length); i++) { 
     if (a.charAt(i) !== b.charAt(i)) { return i; } 
    } 
    if (a.length !== b.length) { return Math.min(a.length, b.length); } 
    return -1; 
} 

¡Gracias Phil por las sugerencias!

+0

Si difieren en el primer carácter, obtendrás 0, pero también si las cadenas coinciden completamente, obtendrás 0. Volvería -1 si coinciden. Además, si b es más corto que a, iterarás más allá del final de b, lo cual es innecesario e imprudente, tal vez iterar hasta el mínimo de las dos longitudes. –

+0

@ Phil muy buenos puntos. Escribí la respuesta sobre mi cabeza, y claramente tiene algunas deficiencias. Lo editaré en consecuencia. – Aleadam

2

Suponiendo, como otras respuestas, que las cadenas que emparejan vuelven -1:

// Find common prefix of strings a and b. 
 
var prefix = function(a,b){ 
 
    return a && a[0] === b[0] ? a[0] + prefix(a.slice(1), b.slice(1)) : ''; 
 
}; 
 

 
// Find index of first difference. 
 
var diff = function(a,b){ 
 
    return a===b ? -1 : prefix(a,b).length; 
 
}; 
 

 
var tests = [ 
 
    ['Hello World!', 'Hi World!'], 
 
    ['aaabab', 'aaabzbzz'], 
 
    ['', ''], 
 
    ['abc', 'abc'], 
 
    ['qrs', 'tu'], 
 
    ['abc', ''], 
 
    ['', 'abc'] 
 
]; 
 

 
console.log('diff', tests.map(test => diff(test[0], test[1]))); 
 

 
// Or just count up to the first difference 
 
// Trickier nested ternary to handle the -1 however. 
 

 
var diff2 = function(a,b){ 
 
    return a === b ? -1 : a[0] === b[0] ? 1 + diff2(a.slice(1), b.slice(1)) : 0; 
 
}; 
 

 
console.log('diff2', tests.map(test => diff2(test[0], test[1])));

0
function firstDiff(a, b) { 
    var i = 0; 

    while (a.charAt(i) === b.charAt(i)) 
     if (a.charAt(i++) === '') 
      return -1; 

    return i; 
} 

devuelve la posición donde las dos cadenas A y B primero difieren o -1 si están igual.

Una más eficiente, pero menos legible versión:

function firstDiff(a, b) { 
    for (var i = 0, c; (c = a.charAt(i)) === b.charAt(i); ++i) 
     if (c === '') 
      return -1; 

    return i; 
} 

Si considera que primero debe stringify los argumentos, y luego hacerlo en la invocación:

firstDiff(toString(a), toString(b)) 

mayoría de las veces que será una pérdida de tiempo. ¡Conoce tus datos!

Cuestiones relacionadas