目录
题目链接:242. 有效的字母异位词 - 力扣(LeetCode)
题目链接:49. 字母异位词分组 - 力扣(LeetCode)
题目链接:438. 找到字符串中所有字母异位词 - 力扣(LeetCode)
题目链接:242. 有效的字母异位词 - 力扣(LeetCode)
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
//如果s,t长度不同则不为字母异位词
if(s.length==t.length)
{
//算是变相哈希表吧,虽然没有key,但通过字母顺序隐含了key值
let record=new Array(26);//记录26个字母分别出现几次
record.fill(0);
//将a转为ASCII码才能进行数值计算
let aAscii='a'.charCodeAt();
// console.log(record);
for(let i=0;i<s.length;i++)
{
//对s和t同时进行扫描,对s中的字符出现次数计算增加,t中字符出现次数计算减少,如果互为字母异位词则record[]全为0
record[s[i].charCodeAt()-aAscii]++;
record[t[i].charCodeAt()-aAscii]--;
// console.log(s[i].charCodeAt()-aAscii);
}
for(let i=0;i<record.length;i++)
{
if(record[i]!=0)
{
return false;
}
}
// console.log(record);
return true;
}
return false;
};
题目链接:383. 赎金信 - 力扣(LeetCode)
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
//整体思想:记录26个字母在两个字符串中出现的次数,ransomeNote--,magazine++,如果recode[]中有负数说明不能构成
var canConstruct = function(ransomNote, magazine) {
let record=new Array(26).fill(0);
// console.log(record);
let aAscii='a'.charCodeAt();
//两个字符长度不一定一致
// for(let i=0,j=0;i<magazine.length||j<ransomNote.length;i++,j++)
// {
// if(i<magazine.length)
// {
// record[magazine[i].charCodeAt()-aAscii]++;
// }
// if(j<ransomNote.length)
// {
// record[ransomNote[j].charCodeAt()-aAscii]--;
// }
// }
let i;
for(i=0;i<ransomNote.length;i++)
{
record[ransomNote[i].charCodeAt()-aAscii]--;
}
for(i=0;i<magazine.length;i++)
{
record[magazine[i].charCodeAt()-aAscii]++;
}
for(i=0;i<record.length;i++)
{
if(record[i]<0)
{
return false;
}
}
// console.log(record);
return true;
};
题目链接:49. 字母异位词分组 - 力扣(LeetCode)
一开始自己用数组啥的硬写出来的但是慢的要死,后来看了题解发现逻辑差不多但人家都用的API
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
let map=new Map();
let strArrStr;
for(let str of strs)
{
//把strs转为数组并根据字母顺序排序,再转成字符串
//相同字符串的即为一组
let strArr=Array.from(str);
// console.log(str);
strArr.sort();
strArrStr=strArr.toString();
// console.log(strArrStr);
//如果该字符串已经有value,则得到这个value数组,如果没有新建数组
let list=map.get(strArrStr)?map.get(strArrStr):new Array();
//把str装入value数组
list.push(str);
//把value数组装入map对应key
map.set(strArrStr,list);
}
//返回map的value数组
return Array.from(map.values());
};
题目链接:438. 找到字符串中所有字母异位词 - 力扣(LeetCode)
/**
* @param {string} s
* @param {string} p
* @return {number[]}
*/
var findAnagrams = function(s, p) {
let sLen=s.length,pLen=p.length;
// console.log(sLen);
// console.log(pLen);
let res=new Array();
if(sLen<pLen)
{
return res;
}
//用字符串相同的方法会溢出
// let start=0,end=pLen;
// let pArr=Array.from(p);
// let pStr=pArr.sort().toString();
// // console.log(pStr);
// while(end<=s.length)
// {
// let subS=s.slice(start,end);
// // console.log(subS);
// let subSArr=Array.from(subS);
// let subSStr=subSArr.sort().toString();
// if(subSStr==pStr)
// {
// res.push(start);
// }
// start++;
// end++;
// }
let pRecord=new Array(26).fill(0);
let subSRecord=new Array(26).fill(0);
let aAscii='a'.charCodeAt();
let i;
for(i=0;i<pLen;i++)
{
pRecord[p[i].charCodeAt()-aAscii]++;
subSRecord[s[i].charCodeAt()-aAscii]++;
}
if(pRecord.toString()==subSRecord.toString())
{
res.push(0);
}
for(i=0;i<sLen-pLen;i++)
{
subSRecord[s[i].charCodeAt()-aAscii]--;
subSRecord[s[i+pLen].charCodeAt()-aAscii]++;
if(subSRecord.toString()==pRecord.toString())
{
res.push(i+1);
}
}
return res;
};