今天主要学习一个新的数据结构,字典树
import java.util.*;
/**
* @author xnl
* @Description:
* @date: 2022/7/7 21:44
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
List<String> list = new ArrayList<String>(){{
add("a");
add("aa");
add("aaa");
add("aaaa");
}};
String s = "a aa a aaaa aaa aaa aaa aaaaaa bbb baba ababa";
System.out.println(solution.replaceWords3(list, s));
}
public String replaceWords2(List<String> dictionary, String sentence) {
String[] split = sentence.split("\\s+");
HashSet<String> set = new HashSet<>(dictionary);
for (int i = 0; i < split.length; i++){
String word = split[i];
for (int j = 0; j < word.length(); j++){
if (set.contains(word.substring(0 , j + 1))){
split[i] = word.substring(0, j + 1);
break;
}
}
}
return String.join(" ", split);
}
/***********************************************分隔符**************************************************/
/**
* treeNode对象实现字典树
* @param dictionary
* @param sentence
* @return
*/
public String replaceWords(List<String> dictionary, String sentence) {
// 构造树
for (String s : dictionary) {
add(s);
}
String[] split = sentence.split("\\s+");
for (int i = 0; i < split.length; i++){
split[i] = query(split[i]);
}
return String.join(" ", split);
}
class Node{
boolean end; // 字符串结束符号
Node[] tns = new Node[26];
}
Node root = new Node();
private void add(String s){
Node p = root;
for (int i = 0; i < s.length(); i++){
int u = s.charAt(i) - 'a';
if (p.tns[u] == null){
p.tns[u] = new Node();
}
p = p.tns[u];
}
p.end = true;
}
private String query(String s){
Node p = root;
for (int i = 0; i < s.length(); i++){
int u = s.charAt(i) - 'a';
// 证明没有匹配的结果,退出啦
if (p.tns[u] == null){
break;
}
// 证明匹配上了,退出
if (p.tns[u].end){
return s.substring(0, i + 1);
}
p = p.tns[u];
}
return s;
}
/**********************************************分隔符***************************************************/
/**
* 数组的方式实现字典树
* @param dictionary
* @param sentence
* @return
*/
int n = 1000000, m = 26;
int[][] tr = new int[n][m];
boolean[] isEnd = new boolean[n * m];
int idx;
private void add2(String s){
int p = 0;
for (int i = 0; i < s.length(); i++){
int u = s.charAt(i) - 'a';
if (tr[p][u] == 0){
tr[p][u] = ++idx;
}
p = tr[p][u];
}
isEnd[p] = true;
}
private String query2(String s){
int p = 0;
for (int i = 0; i < s.length(); i++){
int u = s.charAt(i) - 'a';
if (tr[p][u] == 0){
break;
}
if (isEnd[tr[p][u]]){
return s.substring(0, i + 1);
}
p = tr[p][u];
}
return s;
}
public String replaceWords3(List<String> dictionary, String sentence) {
for (String str : dictionary){
add2(str);
}
String[] split = sentence.split("\\s+");
for (int i = 0; i < split.length; i++){
split[i] = query2(split[i]);
}
return String.join(" ", split);
}
}