[leetcode] 758.Bold Words in String

版权声明:转载请署名 https://blog.csdn.net/drunkpragrammer/article/details/79067844

[problem]

758. Bold Words in String 

Difficulty: Easy


Given a set of keywords words and a string S, make all appearances of all keywords in S bold. Any letters between <b> and </b> tags become bold.


The returned string should use the least number of tags possible, and of course the tags should form a valid combination.


For example, given that words = ["ab", "bc"] and S = "aabcd", we should return "a<b>abc</b>d". Note that returning "a<b>a<b>b</b>c</b>d" would use more tags, so it is incorrect.


Note:


words has length in range [0, 50].
words[i] has length in range [1, 10].
S has length in range [0, 500].
All characters in words[i] and S are lowercase letters.


[Thinking]

Set(c++)


Sets are containers that store unique elements following a specific order.


In a set, the value of an element also identifies it (the value is itself the key, of type T), and each value must be unique. The value of the elements in a set cannot be modified once in the container (the elements are always const), but they can be inserted or removed from the container.


Internally, the elements in a set are always sorted following a specific strict weak ordering criterion indicated by its internal comparison object (of type Compare).


set containers are generally slower than unordered_set containers to access individual elements by their key, but they allow the direct iteration on subsets based on their order.


Sets are typically implemented as binary search trees.

[Solving]

class Solution {
public:
    string boldWords(vector<string>& words, string s) {
        int n = s.size();
        set<string> dict(words.begin(), words.end());
        vector<int> b(n);
        for (int i = 0; i < n; i++) {
            for (int j = i; j - i < 10 && j < n; j++) {
                if (!dict.count(s.substr(i, j + 1 - i))) continue;
                for (int k = i; k <= j; k++)
                    b[k]++;
            }
        }
        string res;
        for (int i = 0; i < n; i++) {
            if (b[i] && (i == 0 || !b[i - 1])) res += "<b>";
            res += s[i];
            if (b[i] && (i == n - 1 || !b[i + 1])) res += "</b>";
        }
        return res;
    }
};


猜你喜欢

转载自blog.csdn.net/drunkpragrammer/article/details/79067844