LeetCode242 有效的字母异位词 & 面试题 01.02. 判定是否互为字符重排
题目
242题中:字符串仅仅包含小写字母。
和其他许多问题一样,首先我们应该向面试官确认一些细节,弄清楚变位词 (anagram) 比较是否区分大小写。比如,God是否为dog的变位词?另外,我们还应该问清楚是否要考虑空白字符。
这里假定变位词比较区分大小写,空白也要考虑在内。也就是说“god ”不是"dog"的变位词。
比较两个字符串时,只要两者长度不同,就不可能是变位词。
解决这个问题有两个简单的解决方法,并且都采用了上述优化,即先比较字符串长度。
解题
解法一:排序
// javascript
var CheckPermutation = function(s1, s2) {
if (s1.length !== s2.length) {
return false;
}
let newS1 = Array.from(s1).sort();
let newS2 = Array.from(s2).sort();
return newS1.join('') === newS2.join('');
};
解法二:哈希表 / 数组
// javascript
var CheckPermutation = function(s1, s2) {
const lenS1 = s1.length, lenS2 = s2.length;
if (lenS1 !== lenS2) {
return false;
}
const sFreq = new Array(256).fill(0);
for (let i = 0; i < lenS1; i++) {
sFreq[s1.charCodeAt(i)]++;
}
for (let i = 0; i < lenS2; i++) {
if (--sFreq[s2.charCodeAt(i)] < 0) {
return false;
}
}
return true;
};
用的是字典数据结构:
// javascript
var CheckPermutation = function(s1, s2) {
const lenS1 = s1.length, lenS2 = s2.length;
if (lenS1 !== lenS2) {
return false;
}
const sFreq = new Map();
for (let i = 0; i < lenS1; i++) {
sFreq.set(s1[i], (sFreq.get(s1[i]) || 0) + 1);
sFreq.set(s2[i], (sFreq.get(s2[i]) || 0) - 1);
}
for (const [char, count] of sFreq.entries()) {
if (count !== 0) {
return false;
}
}
return true;
};
// javascript
var CheckPermutation = function(s1, s2) {
const lenS1 = s1.length, lenS2 = s2.length;
if (lenS1 !== lenS2) {
return false;
}
const sFreq = new Map();
for (let i = 0; i < lenS1; i++) {
sFreq.set(s1[i], (sFreq.get(s1[i]) || 0) + 1);
}
for (let i = 0; i < s2.length; i++) {
if (!sFreq.has(s2[i]) || sFreq.get(s2[i]) <= 0) {
return false;
}
sFreq.set(s2[i], sFreq.get(s2[i]) - 1);
}
return true;
};
时间复杂度:
O
(
n
)
O(n)
O(n),其中
n
n
n 为
s
s
s 的长度。
空间复杂度:
O
(
C
)
O(C)
O(C),其中
C
C
C 为字符集大小。