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에 따라 라이센스가 부여됩니다.