这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
大家好今天给大家分享下一道 LeetCode 简单难度 的题目[有效的字母异位词](leetcode-cn.com/problems/tr…)
题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false
分析
1.字母异位词语,
1.字母出现的次数必须相同
2.字母都是小写词语
3.字符串的长度可能不同
4.如果是返回true,如果不是返回false
解法
1暴力排序
2.hashMap
解法一:暴力
思路
1.先sort
2.迭代逐一比较
*/
var isAnagram = function (s, t) {
// 字符串先排序
const sArr = s.split("");
const tArr = t.split("");
// 如果长度不一样 肯定是false
if (tArr.length !== sArr.length) {
return false;
}
// 分别排序
sArr.sort((a, b) => {
return a.localeCompare(b);
});
tArr.sort((a, b) => {
return a.localeCompare(b);
});
for (let i = 0; i < sArr.length; i++) {
if (tArr[i] !== sArr[i]) {
// 如果不一样则返回false
return false;
}
}
return true;
};
/* 复杂度
时间 O(nlogn) 迭代是N sort是logN
空间 O(1)
*/
解法二:hashMap
思路
1.hashMap统计字母出现次数
2.一旦发现统计的次数小于0 则表明一定是false,因为在字符串字母相同的情况下,
额外多一个字符就会导致少一个其他的字符
*/
var isAnagram = function (s, t) {
const map = new Map();
// 如果长度不一样 肯定是false
if (t.length !== s.length) {
return false;
}
for (const char of s) {
if (map.has(char)) {
map.set(char, map.get(char) + 1);
} else {
map.set(char, 1);
}
}
for (const char of t) {
if (!map.has(char)) {
return false;
}
map.set(char, map.get(char) - 1);
if (map.get(char) < 0) {
return false;
}
}
return true;
};
/* 复杂度
时间 O(n)
空间 O(n)
*/
总结
这道题考察的对 对HashMap的使用,进行统计重复字符,因为hashmap的查询复杂度是O(1)所以可以很好的降低时间复杂度
当然也可以sort之后再逐一比较
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com