【每日一题记录】1657. 确定两个字符串是否接近

148 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

大家好 我是短袖撸码蒂尔尼。今天带来的是一道在LeetCode上的题目,题目难度不大。但我好久没做过这种题目了并且最近在进行代码题复习,就在此为大家分享一下解答思路。

题目阐述

题目在这里
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :

操作 1:交换任意两个 现有 字符。 例如,abcde -> aecdb 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。 例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a ) 你可以根据需要对任意一个字符串多次使用这两种操作。

给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。

示例 1:

输入:word1 = "abc", word2 = "bca" 输出:true 解释:2 次操作从 word1 获得 word2 。 执行操作 1:"abc" -> "acb" 执行操作 1:"acb" -> "bca"

示例 2:

输入:word1 = "a", word2 = "aa" 输出:false 解释:不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。

示例 3:

输入:word1 = "cabbba", word2 = "abbccc" 输出:true 解释:3 次操作从 word1 获得 word2 。 执行操作 1:"cabbba" -> "caabbb" 执行操作 2:"caabbb" -> "baaccc" 执行操作 2:"baaccc" -> "abbccc"

示例 4:

输入:word1 = "cabbba", word2 = "aabbss" 输出:false 解释:不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。  

提示:

1 <= word1.length, word2.length <= 105 word1 和 word2 仅包含小写英文字母

思路阐述

这道题目刚开始看的时候其实是毫无头绪的,因为一眼看下去没有什么共同点。
但是再一次观察题目,不难发现以下几个共同点:

  • word1word2的长度要一致
  • word1word2的字母种类要一致
  • word1word2的字母配比要一致(因为word1 = "cabbba", word2 = "abbccc" 可见两个单词尽管a b c 的具体含量不一样,但是各单词配比都是3:2:1 )

因此我的思路如下:

  • 比较长度 不一致返回false
  • 建立两个map map1map2 遍历的时候记录每个单词的出现次数
  • 通过map.keys() 判断字母种类是否一致 不一致返回 false
  • 通过map.values() 进行排序
  • 然后JSON.stringify比较 判断配比是否一致 不一致返回 false

实现代码

function closeStrings(word1: string, word2: string): boolean {
    if (word1.length != word2.length)
        return false
    let map1 = new Map()
    let map2 = new Map()
    for (let i = 0; i < word1.length; i++) {
        let letter1 = word1.charAt(i)
        let letter2 = word2.charAt(i)
        if (map1.has(letter1)) {
            map1.set(letter1, map1.get(letter1) + 1)
        } else map1.set(letter1, 1)
        if (map2.has(letter2)) {
            map2.set(letter2, map2.get(letter2) + 1)
        } else map2.set(letter2, 1)
    }
    // let letterMap1 = letterMap(word1)
    // let letterMap2 = letterMap(word2)

    for (let key of map1.keys()) {
        if (!map2.has(key))
            return false
    }

    return JSON.stringify([...map2.values()].sort()) == JSON.stringify([...map1.values()].sort())
};

代码评价

image.png 这个用时不太行 得看看有没有更好的方法了

其他方法

var closeStrings = function(word1, word2) {
    if(word1.length != word2.length)return false;
    let tab1 = new Array(26).fill(0);
    let tab2 = new Array(26).fill(0);
    for(let i = 0;i < word1.length;i ++){
        tab1[word1.charCodeAt(i) - 97] ++;
        tab2[word2.charCodeAt(i) - 97] ++;
    }
    for(let i = 0;i < 26;i ++){
        if(tab1[i] && tab2[i])continue;
        if(tab1[i] || tab2[i])return false;
    }
    tab1.sort((a,b)=>a - b);
    tab2.sort((a,b)=>a - b);
    for(let i = 0;i < 26;i ++){
        if(tab1[i] != tab2[i])return false;
    }
    return true;
};

//作者:zhi-ting-c8

这个很巧妙的使用了数组进行存储,大大的节省了时间!

我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg