Please solve the programming task below using a self-contained code snippet in a markdown code block.

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.
 
Please complete the following python code precisely:
```python
class Solution:
    def boldWords(self, words: List[str], s: str) -> str:
```