49、字母异位词分组
0. 题面
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat'];
输出: [['bat'], ['nat', 'tan'], ['ate', 'eat', 'tea']];
示例 2:
输入: strs = [''];
输出: [['']];
示例 3:
输入: strs = ['a'];
输出: [['a']];
提示:
1 <= strs.length <= 104;
0 <= strs[i].length <= 100;
strs[i] 仅包含小写字母
解法
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function (strs) {
const obj = {};
for (let i = 0; i < strs.length; i++) {
const anagram = [...strs[i]].sort().join('');
if (obj[anagram]) {
obj[anagram] = [...obj[anagram], strs[i]];
} else {
obj[anagram] = [strs[i]];
}
}
return Object.keys(obj).map((key, i) => obj[key]);
};
思路:
- 遍历字符串数组,将每个字符串转为数组,排序后再转为字符串,作为 key 存入对象。
- 如果对象中已经存在该 key,则将该字符串添加到该 key 对应的数组中;否则,创建一个新数组。
- 最后返回对象的所有值。
- 复杂度:时间复杂度 O(nklogk),空间复杂度 O(nk),其中 n 是字符串数组的长度,k 是字符串数组中字符串的最大长度。
125、验证回文串
0. 题面
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。
示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s 仅由可打印的 ASCII 字符组成
解法
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function (s) {
const thinStr = s
.replace(/([^a-zA-Z0-9])/g, '')
.replace(/\s/g, '')
.toLowerCase();
return thinStr === thinStr.split('').reverse().join('');
};
思路:
- 先将字符串中的非字母数字字符替换为空字符串, 且去除所有空格, 再将字符串转为小写
- 将得到的字符串劈成数组,用
reverse()方法翻转数组,再用join('')方法拼接成字符串 - 最后比较两个字符串是否相等