leetcode 算法题438 (简单110) 找到字符串中所有字母异位词
- 题目介绍
给定一个字符串 s 和一个非空字符串 p,
找到 s 中所有是 p 的字母异位词的子串,
返回这些子串的起始索引。
字符串只包含小写英文字母,
并且字符串 s 和 p 的长度都不超过 20100。
- 说明
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
- 示例
输入: s: “cbaebabacd” p: “abc”
输出: [0, 6]
解释: 起始索引等于 0 的子串是 “cba”, 它是 “abc” 的字母异位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的字母异位词。
输入: s: “abab” p: “ab”
输出: [0, 1, 2]
解释: 起始索引等于 0 的子串是 “ab”, 它是 “ab” 的字母异位词。起始索引等于 1 的子串是 “ba”, 它是 “ab” 的字母异位词。起始索引等于 2 的子串是 “ab”, 它是 “ab” 的字母异位词。
- 解法一
/**
* @param {string} s
* @param {string} p
* @return {number[]}
*/
var findAnagrams = function(s, p) {
let sTemp = Array(27).fill(0); pTemp = Array(27).fill(0), i = 0, indexs = [];
while(i < p.length) {
sTemp[s.charCodeAt(i) - 97]++;
pTemp[p.charCodeAt(i++) - 97]++;
}
if(sTemp.join('_') === pTemp.join('_')) {
indexs.push(0);
}
while(i < s.length) {
sTemp[s.charCodeAt(i - p.length) - 97]--;
sTemp[s.charCodeAt(i) - 97]++;
if(sTemp.join('_') === pTemp.join('_')) {
indexs.push(i - p.length + 1);
}
i++;
}
return indexs;
};
执行用时 : 324 ms, 在所有 JavaScript 提交中击败了36.92%的用户
内存消耗 : 42.2 MB, 在所有 JavaScript 提交中击败了23.73%的用户
- 解法二
/**
* @param {string} s
* @param {string} p
* @return {number[]}
*/
var findAnagrams = function(s, p) {
let sTemp = Array(27).fill(0); pTemp = Array(27).fill(0), i = 0, indexs = [];
while(i < p.length) {
sTemp[s.charCodeAt(i) - 97]++;
pTemp[p.charCodeAt(i++) - 97]++;
}
if(sTemp.join('_') === pTemp.join('_')) {
indexs.push(0);
}
while(i < s.length) {
sTemp[s.charCodeAt(i - p.length) - 97]--;
sTemp[s.charCodeAt(i) - 97]++;
if(sTemp.join('_') === pTemp.join('_')) {
indexs.push(i - p.length + 1);
}
i++;
}
return indexs;
};
执行用时 : 120 ms, 在所有 JavaScript 提交中击败了94.62%的用户
内存消耗 : 38.3 MB, 在所有 JavaScript 提交中击败了54.24%的用户