class Solution { class Interval { public int start; public int end; public Interval(int x, int y) { start = x; end = y; } } public String addBoldTag(String s, String[] dict) { List<Interval> intervals = new ArrayList<>(); for (String str : dict) { int index = -1; index = s.indexOf(str, index); while (index != -1) { intervals.add(new Interval(index, index + str.length())); index +=1; index = s.indexOf(str, index); } } StringBuilder result = new StringBuilder(); if (intervals.size() == 0) { return s; } Collections.sort(intervals, (i1, i2) -> i1.start - i2.start); Interval current = intervals.get(0); result.append(s.substring(0, current.start)); result.append("<b>"); for (int i = 1; i < intervals.size(); i++) { if (current.end >= intervals.get(i).start) { current.end = Math.max(intervals.get(i).end, current.end); } else { result.append(s.substring(current.start, current.end)).append("</b>"); result.append(s.substring(current.end, intervals.get(i).start)).append("<b>"); current = intervals.get(i); } } result.append(s.substring(current.start, current.end)).append("</b>"); if (current.end < s.length()) { result.append(s.substring(current.end)); } return result.toString(); } }