---
# System prepended metadata

title: 0616. Add Bold Tag in String
tags: [Leetcode, FaceBook, Merge Interval-Jump Game, Medium]

---

# 0616. Add Bold Tag in String
###### tags: `Leetcode` `FaceBook` `Medium` `Merge Interval-Jump Game`
Link: https://leetcode.com/problems/add-bold-tag-in-string/
## 思路 
思路二跑出来的结果比思路一快
### 思路一
merge interval的方法，很巧妙
和[55.Jump Game](https://hackmd.io/BLDJgdvVR2yk2ZZka2dArg)思路有点像
一直记录从现在这个位置i能到达的最远位置end，如果end>i，那么这个位置填true
### 思路二 O(M * N) M是s的长度 N是words里面所有word的长度和
对于每个word而言，先用```s.indexOf(word, startPosition)```找到它出现的位置
然后用一个array记录每个位置应不应该在bold里面
一开始的方法是像line 11-15一样，把每个位置标记成true
但是更简单的方法是只在首尾标记，然后用prefix sum算出这个位置在不在bold里面
注：indexOf(s, word)的复杂度是O(m * n), m是s的长度，n是word的长度
## Code
### 思路一
```java=
public class Solution {
    public String addBoldTag(String s, String[] dict) {
        boolean[] bold = new boolean[s.length()];
        for (int i = 0, end = 0; i < s.length(); i++) {
            for (String word : dict) {
                if (s.startsWith(word, i)) {
                    end = end>(i + word.length())?end:(i + word.length());
                }
            }
            bold[i] = end > i;
        }
        
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (!bold[i]) {
                result.append(s.charAt(i));
                continue;
            }
            int j = i;
            while (j < s.length() && bold[j]) j++;
            result.append("<b>" + s.substring(i, j) + "</b>");
            i = j - 1;
        }
        
        return result.toString();
    }
}
```
### 思路二
```java=
class Solution {
    public String addBoldTag(String s, String[] words) {
        int len = s.length();
        int[] isBold = new int[len+1];
        for(String word:words){
            int idx = s.indexOf(word);
            while(idx != -1){
                int start = idx;
                int end = word.length()+idx;
                
                // for(int i = start;i < end;i++){
                //     if(!isBold[i]){
                //         isBold[i] = true;
                //     }
                // }
                
                isBold[start]++;
                isBold[end]--;
                
                idx++;
                idx = s.indexOf(word, idx);
            }
        }
        
        StringBuilder sb = new StringBuilder();
        boolean inBold = false;
        int prev = 0;
        for(int i = 0;i <= len;i++){
            int curr = prev+isBold[i];
            if(prev == 0 && curr > 0){
                sb.append("<b>");
                inBold = true;
            }
            if(prev > 0 && curr == 0){
                sb.append("</b>");
                inBold = false;
            }
            if(i == len) break;
            sb.append(s.charAt(i));
            prev = curr;
        }
        return sb.toString();
    }
}