✅ WEB- ja WordPress -uutiset, -teemat, -laajennukset. Täällä jaamme vinkkejä ja parhaita verkkosivustoratkaisuja.

Algoritmi sanojen lihavointiin HTML:ssä

23

Kun on annettu joukko avainsanoja sanoja ja merkkijono S, tee kaikki avainsanat S lihavoidulla. Kaikki ja -tunnisteiden väliset kirjaimet lihavoittuvat.

Palautettavan merkkijonon tulee käyttää mahdollisimman vähän tageja, ja tietysti tagien tulee muodostaa kelvollinen yhdistelmä.

Koska esimerkiksi sanat = ["ab", "bc"] ja S = "aabcd", meidän pitäisi palauttaa "a abc d". Huomaa, että "a a bcd":n palauttaminen käyttäisi enemmän tageja, joten se on väärin.

merkintä:

  • sanojen pituus on alueella [0, 50].
  • sanojen [i] pituus on alueella [1, 10].
  • S:n pituus on alueella [0, 500].
  • Kaikki merkit sanoissa[i] ja S ovat pieniä kirjaimia.

Lihavoita merkkijonoa käyttämällä Bruteforce-algoritmia

Ilman lyhimmän vaatimusta voimme lihavoida kaikki luettelon sanat. Koska saamme alkuperäisen HTML-merkkijonon, voimme merkitä lihavoinnin jokaiselle lihavoidussa sanassa näkyvälle merkille.

Joten O(N) välilyönnillä ja O(NM):llä, jossa N on merkkijonon koko ja M on lihavoitun merkkijonon kokonaispituus, seuraava C++ bruteforce -algoritmi lisää vähiten vaatimuksen täyttäviä HTML-lihavoituja tageja.

class Solution {
public:
    string boldWords(vector<string>& words, string S) {
        int n = S.size();
        vector<bool> bold(n, false);
        for (const auto &s: words) {
            for (int i = 0; i + s.size() - 1 < n; ++ i) {
                bool ok = true;
                for (int k = 0; k < s.size(); ++ k) {
                    if (s[k] != S[i + k]) { // bold string s not found in the string
                        ok = false;
                        break;
                    }
                }
                if (ok) { // it is bold
                    for (int k = 0; k < s.size(); ++ k) {
                        bold[i + k] = true; // mark the character bold
                    }
                }
            }
        }
        string ans = "";
        for (int i = 0; i < n; ++ i) {
            // bold start boundary
            if (bold[i] && (i == 0 || !bold[i - 1])) ans += "<b>"; 
            ans += S[i];
            // bold end boundary
            if (bold[i] && (i == n - 1 || !bold[i + 1])) ans += "</b>";
        }
        return ans;
    }
};

Kun lihavoidut merkit on merkitty, skannaamme merkkijonon uudelleen ja etsimme rajat ja lisäämme tunnisteet vastaavasti.

Tämä verkkosivusto käyttää evästeitä parantaakseen käyttökokemustasi. Oletamme, että olet kunnossa, mutta voit halutessasi kieltäytyä. Hyväksyä Lisätietoja