![](/img/trans.png)
[英]Time complexity of determining if a string is a subset of another string
[英]Optimizing determining whether a subset of a string can be rearranged to form another string
完成 function scramble(str1, str2)
如果str1
字符的一部分可以重新排列以匹配str2
則返回 true,否則返回 false。
筆記:
s1
和s2
以 null 終止。例子
'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
}
如果字符串非常大以至於運行時確實是一個問題,您可以首先將其中一個字符串分組到 object 中,這樣總體復雜度是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'));
您可以通過為每個單詞制作頻率計數器來在線性時間內完成此操作。 如果對於str2
中的每個唯一字符,您發現它的字母數<=
str1
中該字符的計數,則返回 true,因為str1
有一些可以形成str2
的字符子集。
代碼:
const frequencyCount = s => [...s].reduce((a, e) => { a[e] = ++a[e] || 1; return a; }, {}); const scramble = (a, b) => { const aFreq = frequencyCount(a); return Object.entries(frequencyCount(b)).every(([e, count]) => count <= aFreq[e] ); }; console.log(scramble("rkqodlw", "world")); console.log(scramble("katas", "steak"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.