簡體   English   中英

如何在Javascript中有效地匹配和分組字符串?

[英]How to match and group strings efficiently in Javascript?

編寫一個函數,該函數返回一個整數,該整數指示一組字符串“ pzmcb”在字符串中沒有出現的次數。 例如輸入字符串1->“ abdpsclmhz”輸出1-> 1輸入字符串2:pzmcbcbpzmpcm輸出2:2

我已經編寫了代碼,但效率不高,無法處理較大的輸入字符串。 如果可以提供一種有效的編寫此功能的方法,我將不勝感激

'use strict';

//pmzcbpmzcbpmz  [0 -4] [5 - 9] returns 2

function matchGroup(word) {
    let regex = /[pzmcb]/g
  let stringArray = word.match(regex);

  //console.log(stringArray);
  let cloneArray = [...stringArray];
  let stored = [];
  let searchString = "";
  let secondString = "";
  let temp = "";
    let tempArray = [];

  stringArray.forEach(item => {
    if (cloneArray.indexOf(item) >= 0 && searchString.indexOf(item) === -1) {
        searchString += item;
        if (searchString.length === 5) {
          stored.push(searchString);
          searchString = "";
        }
    } else if(secondString.indexOf(item) === -1){
        secondString += item;
      if (secondString.length === 5) {
          stored.push(searchString);
          secondString = "";
        }
    }else {
       temp += item;
      if (temp.length === 5) {
          tempArray.push(temp);
          temp = "";
      }
    }
});

    return stored.length;
// return integer
}


var paragraph = 'pzmcbpdfbcmz';
let result = matchGroup("abcdefpfklmhgzpzmcbpdfbcmzjklmoplzdsaklmcxheqgexcmpzdhgiwqertyhgdsbnmkjilopazxcsdertijuhgbdmlpoiqarstiguzcmnbgpoimhrwqasfgdhuetiopmngbczxsgreqad");
console.log(result);

我希望matchGroup函數為大輸入返回精確的整數

function countChar(char, string) {
    return (string.match(new RegExp(char, "g")) || []).length;
}

function countDistinctSubstring(sub, string) {
    firstChars = {};
    for (i = 0; i < sub.length; i++) {
        if (sub[i] in firstChars)
            firstChars[sub[i]]++;
        else
            firstChars[sub[i]] = 1;
    }
    return Math.min(...Object.keys(firstChars).map(key => Math.floor(countChar(key, string) / firstChars[key])));
}
> countDistinctSubstring("pzmcb", "abdpsclmhz");
< 1
> countDistinctSubstring("pzmcb", "pzmcbcbpzmpcm");
< 2
> countDistinctSubstring("pzmcbpdfbcmz", "abcdefpfklmhgzpzmcbpdfbcmzjklmoplzdsaklmcxheqgexcmpzdhgiwqertyhgdsbnmkjilopazxcsdertijuhgbdmlpoiqarstiguzcmnbgpoimhrwqasfgdhuetiopmngbczxsgreqad");
< 3

我不能肯定地說,但是我認為這就是您想要的。 它計算小字符串中每個字母的出現次數,然后找到每個字符中大字符串與小字符串中出現的最小比率。 此最小比率是小字符串可以由較大字符串中的字母組成的最大不重復次數。

請注意, 此答案用於制作countChar函數。

我會建立一個字符計數圖:

   function countChars(str) {
     const count = {};
     for(const char of str) count[char] = (count[char] || 0) + 1;
     return count;
  }

現在,我們可以輕松地建立要查找的字符串和源的計數映射:

   const toFind = countChars("pzmbc"),
      source = countChars("pzmcbpdfbcmz");

現在,我們可以找到要查找的字符和存在的字符之間的最小關系:

  const result = Math.min(
     ...Object.entries(toFind).map(([char, need]) => Math.floor((source[char] || 0) / need))
  );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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