616. Add Bold Tag in String
class Solution {
    TrieNode root;
    public String addBoldTag(String s, String[] dict) {
        root = new TrieNode('a');
        for (String word : dict) {
            addToTrie(root, word);
        }
        int pt = 0;
        List intervals = new ArrayList<>();
        while (pt < s.length()) {
            int reach = getReachLength(root, s, pt);
            if (reach != 0) {
                intervals.add(new Interval(pt, pt + reach - 1));
            }
            pt++;
        }
        intervals = mergeIntervals(intervals);
        int prev = 0;
        StringBuilder sb = new StringBuilder();
        for (Interval interval : intervals) {
            sb.append(s.substring(prev, interval.start));
            sb.append("");
            sb.append(s.substring(interval.start, interval.end + 1));
            sb.append("");
            prev = interval.end + 1;
        }
        sb.append(s.substring(prev));
        return sb.toString();
    }
    
    private List mergeIntervals(List intervals) {
        List ans = new ArrayList<>();
        if (intervals == null) return ans;
        
        Interval last = null;
        for (Interval cur : intervals) {
            if (last == null) {
                last = cur;
                continue;
            }
            if (cur.start <= last.end + 1) {
                last.end = Math.max(last.end, cur.end);
            } else {
                ans.add(last);
                last = cur;
            }
        }
        if (last != null) ans.add(last);
        return ans;
    }
    private void addToTrie(TrieNode root, String word) {
        for (int i = 0; i < word.length(); i++) {
            root = root.getOrAdd(word.charAt(i));
        }
        root.isWord = true;
    }
    private int getReachLength(TrieNode root, String s, int pt) {
        List ans = new ArrayList<>();
        int i = 0;
        while (root != null && pt + i < s.length()) {
            char c = s.charAt(pt + i);
            root = root.getChild(c);
            if (root!= null && root.isWord) ans.add(i + 1);
            i++;
        }
        if (ans.size() == 0) return 0;
        return ans.get(ans.size() - 1);
    }
}
class Interval {
    int start;
    int end;
    public Interval(int start, int end) {
        this.start = start;
        this.end = end;
    }
}
class TrieNode {
    char ch;
    boolean isWord;
    Map children;
    public TrieNode(char ch) {
        this.ch = ch;
        this.children = new HashMap<>();
    }
    public TrieNode getOrAdd(char c) {
        children.putIfAbsent(c, new TrieNode(c));
        return children.get(c);
    }
    public TrieNode getChild(char c) {
        return children.get(c);
    }
}
      이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.