携手创作,共同成长!这是我参与「掘金日新计划 · 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 仅包含小写英文字母
思路阐述
这道题目刚开始看的时候其实是毫无头绪的,因为一眼看下去没有什么共同点。
但是再一次观察题目,不难发现以下几个共同点:
- word1和word2的长度要一致
- word1和word2的字母种类要一致
- word1和word2的字母配比要一致(因为word1 = "cabbba", word2 = "abbccc" 可见两个单词尽管a b c 的具体含量不一样,但是各单词配比都是3:2:1 )
因此我的思路如下:
- 比较长度 不一致返回false
- 建立两个map map1和map2 遍历的时候记录每个单词的出现次数
- 通过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())
};
代码评价
这个用时不太行 得看看有没有更好的方法了
其他方法
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
这个很巧妙的使用了数组进行存储,大大的节省了时间!
我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!