剑指 Offer II 117. 相似的字符串

214 阅读1分钟

剑指 Offer II 117. 相似的字符串

  • var pi = find(i) 读取i的value
  • var pj = find(j) 读取j的value
  • if (check(i, j)) { 检验i 和 j 位置的字符串是否是 相似的
  • parent[pi] = pj 具备相似性,那么让 pi去跟踪 pj,让他们具有关联性
  • function find(i) { 读取参数ivalue值,一般情况下读取parent[i],但是如果发现parent[i] !== i,那么我们需要进一步查询parent[i]的位置,就这样递归查询下去直到遇到parent === parent[i]返回结果
  • function check(i, j) { 遍历字符串,比较两个字符串同一位置的字符不相等的个数超过了2,则不是
var numSimilarGroups = function (strs) {
    var len = strs.length;
    var parent = new Array(len).fill().map((v, i) => i)
    for (var i = 0; i < len; i++) {
        for (var j = i + 1; j < len; j++) {
            var pi = find(i)
            var pj = find(j)
            if (check(i, j)) {
                parent[pi] = pj
            }
        }
    }
    var res = 0;
    for (var i = 0; i < len; i++) {
        if (parent[i] == i) {
            res++
        }
    }
    return res
    function find(i) {
        var value = parent[i]
        if (value !== i) {
            parent[i] = find(value)
        }
        return parent[i]
    }
    function check(i, j) {
        var str1 = strs[i]
        var str2 = strs[j]
        var num = 0;
        for (var k = 0; k < str1.length; k++) {
            if (str1[k] !== str2[k]) num++
            if (num > 2) return false
        }
        return true
    }
};