第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這個字符串搜索算法可以優(yōu)化嗎?

這個字符串搜索算法可以優(yōu)化嗎?

PIPIONE 2023-07-20 15:48:01
最近,我嘗試在一個流行的編碼網(wǎng)站上進行“測試”,該網(wǎng)站提出了以下問題:在給定的字符串s中,找到包含最多元音的、大小為k的子串。例子s =“eirowpfmsnaq uisaa ”且k = 5 -第 1 遍 - 子字符串 =“eirow” - 元音 = 3第 2 遍 - 子字符串 =“irowp” - 元音 = 2第 3 遍 - 子字符串 =“rowpf” - 元音 = 1第 4 遍 - 子字符串 =“owpfm” - 元音 = 1第 5 遍 - 子串 = "wpfms" - 元音 = 0第 6 遍 - 子字符串 = "pfmsn" - 元音 = 0第 7 遍 - 子字符串 =“fmsna” - 元音 = 1第 8 遍 - 子字符串 =“msnaq” - 元音 = 1第 9 遍 - 子字符串 =“snaqu” - 元音 = 2第 10 遍 - 子字符串 =“naqui” - 元音 = 3第 11 遍 - 子字符串 =“aquis” - 元音 = 3第 12 遍 - 子字符串 =“quisa” - 元音 = 3第 13 遍 - 子字符串 =“uisaa” - 元音 = 4(最終結果)我創(chuàng)建了一個初始的簡單迭代函數(shù),它只是從 0 迭代到字符串長度減去子字符串的長度(i=0 到 i<s.length-k)const countVowels = str => str.length - str.replace((/[aeiouAEIOU]/gi), "").lengthlet findSubstring = (s,k) => {  let max = 0, dict = {}  for(let i=0;i<=s.length-k;i++) { // iterate over string length - k    dict[i] = countVowels(s.slice(i, k+i)) // add vowels in substring to dict    if(dict[i] > dict[max]) max = i // if there are more vowels than the max encountered this is the new max  }  return max === 0 ? "Not found!" : s.slice(max, max+k); // return substring if found}我發(fā)現(xiàn)此方法對于某些測試用例是成功的,但在 10 秒超時和較大輸入的情況下多次失敗。作為第二次嘗試,我決定將元音計數(shù)從循環(huán)中刪除,并使用映射對于較大的輸入來說會更快。由于 V2 中計算最終結果的額外開銷,對于較小的輸入,第一次嘗試會更快。作為對較小值(例如s長度小于 500、k小于 100)的比較,V1 的性能將優(yōu)于 V2 9/10 倍。然而,一旦s的長度超過 500 并且k超過 100,您可以看到 V2 優(yōu)于 V1,并且性能裕度隨著s和k變大而增長(正如您所期望的)然而,我發(fā)現(xiàn)當使用 V2 時,我的測試仍然由于超時而失敗。我看不到 V2 中可以進行任何更改以顯著優(yōu)化它,因此我很想知道是否有人有任何想法可以使其更快地處理大量輸入。
查看完整描述

1 回答

?
楊魅力

TA貢獻1811條經(jīng)驗 獲得超6個贊

像這樣的東西會快得多,它只是一次 O(1) 查找的線性傳遞:


def count_vowels(s, k):

    vowels = set("aeiouAEIOU")


    #count first k

    t = sum(1 for i in s[:k] if i in vowels)

    mx = t

    for i in range(k, len(s)):

        if s[i] in vowels:

            t+=1

        if s[i-k] in vowels:

            t-=1

        if t > mx:

            mx = t


    return mx


count_vowels("eirowpfmsnaquisaaaa",5)

下面是如何在 JavaScript 中實現(xiàn)這一點:


function count_vowels(s, k) {

  const vowels = new Set(Array.from("aeiouAEIOU"));


  let t = 0;

  //count first k

  for (let i = 0; i < k && i < s.length; i++) {

    t += vowels.has(s[i]) ? 1 : 0;

  }


  let mx = t;


  for (let i = k; i < s.length; i++) {

    if (vowels.has(s[i])) {

      t += 1

    }

    if (vowels.has(s[i - k])) {

      t -= 1;

    }

    if (t > mx) {

      mx = t;

    }

  }


  return mx;

}


console.log(count_vowels("eirowpfmsnaquisaaaa", 5))


查看完整回答
反對 回復 2023-07-20
  • 1 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號