gpt4 book ai didi

javascript - 使用 Javascript 检测两个字符串之间的差异

转载 作者:行者123 更新时间:2023-12-03 13:35:03 24 4
gpt4 key购买 nike

使用 Javascript,我想检查两个字符串之间有多少差异。

就像是:

var oldName = "Alec";
var newName = "Alexander";
var differences = getDifference(oldName, newName) // differences = 6
  • 添加到名称中的任何字母都应计为每个字母一个更改。
  • 更改字母应计为每个字母的更改。交换两个
  • 字母应该算作两个变化,因为你真正改变了每个
    信。
  • 但是,移动一个字母并插入另一个字母应该只算作一次更改。

  • 例如:

    将“Alex”更改为“Alexander”将是 5 个更改,因为添加了 5 个字母

    将“Alex”更改为“Allex”只是一个更改,因为您添加了一个“l”并将其余部分转移但没有更改它们

    将“Alexander”更改为“Allesander”将是 2 个更改(添加“l”并将“x”更改为“s”)。

    我可以将每个名称拆分成一个字母数组,然后像在 jsFiddle 中那样轻松地比较它们。具有以下功能:
    function compareNames(){
    var oldName = $('#old').val().split("");
    var newName = $('#new').val().split("");
    var changeCount = 0;
    var testLength = 0;
    if(oldName.length > newName.length){
    testLength=oldName.length;
    }
    else testLength=newName.length;
    for(var i=0;i<testLength;i++){
    if(oldName[i]!=newName[i]) {
    changeCount++;
    }
    }
    alert(changeCount);
    }

    但是我怎么能解释字母的移动而不是变化呢?

    更新:这是我如何让它工作的

    Levenshtein 距离 正是我所需要的。感谢彼得!

    Working jsFiddle

    $(function () {
    $('#compare').click(function () {
    var oldName = $('.compare:eq(0)').val();
    var newName = $('.compare:eq(1)').val();
    var count = levDist(oldName, newName);
    $('#display').html('There are ' + count + ' differences present');
    });
    });

    function levDist(s, t) {
    var d = []; //2d matrix

    // Step 1
    var n = s.length;
    var m = t.length;

    if (n == 0) return m;
    if (m == 0) return n;

    //Create an array of arrays in javascript (a descending loop is quicker)
    for (var i = n; i >= 0; i--) d[i] = [];

    // Step 2
    for (var i = n; i >= 0; i--) d[i][0] = i;
    for (var j = m; j >= 0; j--) d[0][j] = j;

    // Step 3
    for (var i = 1; i <= n; i++) {
    var s_i = s.charAt(i - 1);

    // Step 4
    for (var j = 1; j <= m; j++) {

    //Check the jagged ld total so far
    if (i == j && d[i][j] > 4) return n;

    var t_j = t.charAt(j - 1);
    var cost = (s_i == t_j) ? 0 : 1; // Step 5

    //Calculate the minimum
    var mi = d[i - 1][j] + 1;
    var b = d[i][j - 1] + 1;
    var c = d[i - 1][j - 1] + cost;

    if (b < mi) mi = b;
    if (c < mi) mi = c;

    d[i][j] = mi; // Step 6

    //Damerau transposition
    if (i > 1 && j > 1 && s_i == t.charAt(j - 2) && s.charAt(i - 2) == t_j) {
    d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);
    }
    }
    }
    // Step 7
    return d[n][m];
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
    <input type="button" id="compare" value="Compare" /><br><br>
    <input type="text" id="old" class="compare" value="Alec" />
    <input type="text" id="new" class="compare" value="Alexander" />
    <br>
    <br>
    <span id="display"></span>


    感谢 James Westgate 的功能:

    Jame's post showing this function

    最佳答案

    我手头本身没有 Javascript 实现,但是您正在做一些存在完善算法的事情。具体来说,我相信您正在寻找两个字符串之间的“Levenshtein 距离”——即插入、替换和删除的数量(假设您将删除视为更改)。

    The wikipedia page for Levenshtein distance有各种伪代码实现,您可以从中开始,引用资料也可能对您有所帮助。

    关于javascript - 使用 Javascript 检测两个字符串之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18050932/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com