簡體   English   中英

優化確定是否可以重新排列字符串的子集以形成另一個字符串

[英]Optimizing determining whether a subset of a string can be rearranged to form another string

完成 function scramble(str1, str2)如果str1字符的一部分可以重新排列以匹配str2則返回 true,否則返回 false。

筆記:

  • 僅使用小寫字母 (az)。 不包含標點符號或數字。
  • 需要考慮性能
  • 輸入字符串s1s2以 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM