Table of Contents
Problem Statement
Bold Words in String LeetCode Solution – Given an array of keywords words
and a string s
, make all appearances of all keywords words[i]
in s
bold. Any letters between <b>
and </b>
tags become bold.
Return s
after adding the bold tags. The returned string should use the least number of tags possible, and the tags should form a valid combination.
Example
Test Case 1:
Input:
words = [“ab”, “bc”]
s = “aabcd”
Output:
“a<b>ab</b>cd”
Explanation
We might think returning “a<b>a<b>b</b>c</b>d” will be easy. But it would use more tags. But we need to use the least number of tags. So the correct output is “a<b>ab</b>cd”.
Approach
Idea
- boldMap initialize with all 0, use for mark bold char.
- Go through each word and mark it in boldMap.
- loop through string S and use openTag to check if we should open or close the tag.
- In the end, if the tag is still open, we should close it.
Code for Bold Words in String LeetCode Solution
Java Program
class Solution { public String boldWords(String[] words, String s) { boolean[] bold = new boolean[s.length() + 1]; for(String w : words) for(int i = s.indexOf(w); i != -1; i = s.indexOf(w, i + 1)) Arrays.fill(bold, i, i + w.length(), true); StringBuilder r = new StringBuilder(bold[0] ? "<b>" : ""); for(int i = 0; i < bold.length - 1; i++){ r.append(s.charAt(i)); r.append(bold[i] && !bold[i + 1] ? "</b>" : ""); r.append(!bold[i] && bold[i + 1] ? "<b>" : ""); } return r.toString(); } }
C++ Program
class Solution { public: string boldWords(vector<string>& words, string S) { vector<bool> bold(S.size(), false); for(int i=0;i<words.size();i++) { for(int j=0;j+words[i].size()<=S.size();j++) { if(S.substr(j, words[i].size())!=words[i]) continue; for(int k=0;k<words[i].size();k++) bold[j+k]=true; } } string res; if(bold[0]) res+="<b>"; for(int i=0;i<S.size();i++) { res.append(1, S[i]); if(i==S.size()-1) break; if(!bold[i]&&bold[i+1]) res+="<b>"; else if(bold[i]&&!bold[i+1]) res+="</b>"; } if(bold.back()) res+="</b>"; return res; } };
Complexity Analysis for Bold Words in String LeetCode Solution
Let N be the length of the input string.
Time complexity: O(N)
We are only iterating over the input string. So it will take O(N) time.
Space complexity: O(N)
We are storing the string in an array. So it will take O(N) space.
Reference: https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Text_formatting