优化确定是否可以重新排列字符串的子集以形成另一个字符串
完成scramble(str1, str2)如果部分str1字符可以重新排列匹配则返回真的函数str2,否则返回假。
笔记:
- 将仅使用小写字母 (az)。将不包含标点符号或数字。
- 性能需要考虑
- 输入字符串
s1和s2空终止。
例子
'rkqodlw', 'world' ==> True
'katas', 'steak' ==> False
我的代码:
function scramble(str1, str2) {
let str = '';
for (i = 0; i < str2.length; i++) {
if (str1.includes(str2[i])) {
str1 = str1.replace(str2[i], '')
str += str2[i]
}
if (str === str2) return true
}
return false
}
回答
如果字符串如此之大以至于运行时确实是一个问题,您可以先将其中一个字符串组合到一个对象中,这样整体复杂性就O(n)不是O(n ^ 2):
function scramble(str1, str2) {
const grouped = {};
for (const char of str1) {
grouped[char] = (grouped[char] || 0) + 1;
}
for (const char of str2) {
if (!grouped[char]) return false;
grouped[char]--;
}
return true;
}
console.log(scramble('rkqodlw', 'world'));
console.log(scramble('katas', 'steak'));