目录
1,题目
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
2,代码
2.1 我思考完成的-初版--哈希表思想
之前题目中有过类似题目,故尝试做了一下;
实现逻辑:
题目要求:s和t中字符出现次数要一样;
因此:
第一步:s和t的字符串长度要一致,否则返回false
第二步:统计s中每个字符出现次数
- 利用charCodeAt()函数 计算字符的 Unicode 编码;
- s[i].charCodeAt()-'a'.charCodeAt() 的结果 即可作为数组的下标;
第三步:统计t中每个字符出现次数
- 在s字符串处理后的cts[]数组的基础上,进行 cts[t[i].charCodeAt()-'a'.charCodeAt()]-- 操作,实现对同一个字母出现次数的 正负计算;
第四步:判断cts数组中元素是否全为0
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length != t.length){
return false;
}
const len = s.length;
let cts=new Array(26).fill(0)
for(let i=0;i<len;i++){
cts[s[i].charCodeAt()-'a'.charCodeAt()]++;
}
for(let i=0;i<len;i++){
cts[t[i].charCodeAt()-'a'.charCodeAt()]--;
}
return cts.some(item=>item!=0)?false :true
};
2.2略改进
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length != t.length){
return false;
}
const len = s.length;
let cts=new Array(26).fill(0)
for(let i=0;i<len;i++){
cts[s[i].charCodeAt()-'a'.charCodeAt()]++;
cts[t[i].charCodeAt()-'a'.charCodeAt()]--;
}
return cts.some(item=>item!=0)?false :true
};
没有必要两个for循环,一开始我害怕由于s和t中某字符出现先后顺序不同,从而有负值,经过二次思考,理解只要遍历结束 时,满足出现总次数为0即可;
2.3排序思想
分析:t 是 s 的异位词等价于「两个字符串排序后相等」。
var isAnagram = function(s, t) {
return s.length == t.length && [...s].sort().join('') === [...t].sort().join('')
};
作者:力扣官方题解
[...s]
和[...t]
:这里使用扩展运算符...
将字符串s
和t
转换为字符数组。这样做是为了能够使用数组的sort
方法。.sort()
:对字符数组进行排序。默认情况下,sort
方法按照字符编码的顺序对数组元素进行排序。.join('')
:将排序后的字符数组通过空字符串连接起来,转换回字符串。这样,如果s
和t
是字谜的话,它们排序后应该得到完全相同的字符串。===
:使用严格等于运算符比较两个排序并重新连接成字符串的结果是否完全相等。
3,学习与总结
3.1 判断数组元素是否都为0
方法一:some()
var arr = [0, 0, 0, 0, 0, 0]
console.log(!arr.some(item => item !== 0)) //true
方法二:eval()对字符串求和
var arr = [0, 0, 0, 0, 0, 0];
console.log(eval(arr.join("+"))==0); //true
3.2总结
共两种思路
哈希表:借助数组构造
排序:涉及 字符串到数组的转换 数组到字符串的转换
勉励自己:坚持一周啦!贵在坚持!