208. 实现 Trie (模板题)
class TrieNode{
boolean isWord;
TrieNode[] children=new TrieNode[26];
TrieNode() {}
}
class Trie {
TrieNode root;
/** Initialize your data structure here. */
public Trie() {
root=new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
TrieNode cur=root;
for(int i=0;i<word.length();i++){
int c=word.charAt(i)-'a';
if(cur.children[c]==null){
cur.children[c]=new TrieNode();
}
cur=cur.children[c];
}
cur.isWord=true;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
TrieNode cur=root;
for(int i=0;i<word.length();i++){
int c=word.charAt(i)-'a';
if(cur.children[c]==null){
return false;
}
cur=cur.children[c];
}
if(cur.isWord){
return true;
}else{
return false;
}
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
TrieNode cur=root;
for(int i=0;i<prefix.length();i++){
int c=prefix.charAt(i)-'a';
if(cur.children[c]==null){
return false;
}
cur=cur.children[c];
}
return true;
}
}
820. 单词的压缩编码
题目
给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。
例如,如果这个列表是 [“time”, “me”, “bell”],我们就可以将其表示为 S = “time#bell#” 和 indexes = [0, 2, 5]。
对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 “#” 结束,来恢复我们之前的单词列表。
那么成功对给定单词列表进行编码的最小字符串长度是多少呢?
示例:
输入: words = [“time”, “me”, “bell”]
输出: 10
说明: S = “time#bell#” ,indexes = [0, 2, 5] 。
class Solution {
public int minimumLengthEncoding(String[] words) {
int len = 0;
Trie trie = new Trie();
// 先对单词列表根据单词长度由长到短排序
Arrays.sort(words, (s1, s2) -> s2.length() - s1.length());
// 单词插入trie,返回该单词增加的编码长度
for (String word: words) {
len += trie.insert(word);
}
return len;
}
}
// 定义tire
class Trie {
TrieNode root;
public Trie() {
root = new TrieNode();
}
public int insert(String word) {
TrieNode cur = root;
boolean isNew = false;
// 倒着插入单词
for (int i = word.length() - 1; i >= 0; i--) {
int c = word.charAt(i) - 'a';
if (cur.children[c] == null) {
isNew = true; // 是新单词
cur.children[c] = new TrieNode();
}
cur = cur.children[c];
}
// 如果是新单词的话编码长度增加新单词的长度+1,否则不变。
return isNew? word.length() + 1: 0;
}
}
class TrieNode {
char val;
TrieNode[] children = new TrieNode[26];
public TrieNode() {}
}
作者:sweetiee
链接:https://leetcode-cn.com/problems/short-encoding-of-words/solution/99-java-trie-tu-xie-gong-lue-bao-jiao-bao-hui-by-s/
面试题 17.13. 恢复空格
class Solution {
public int respace(String[] dictionary, String sentence) {
//构建字典树
Trie trie=new Trie();
for(String word:dictionary){
trie.insert(word);
}
//动态规划
int n=sentence.length();
int[] dp=new int[n+1];
for(int i=1;i<=n;i++){
dp[i]=dp[i-1]+1;
for(int idx:trie.search(sentence,i-1)){
dp[i]=Math.min(dp[i],dp[idx]);
}
}
return dp[n];
}
}
class TrieNode{
boolean isWord;
TrieNode[] children=new TrieNode[26];
public TrieNode() {}
}
class Trie{
TrieNode root;
public Trie(){
root=new TrieNode();
}
//单词倒序插入字典树
public void insert(String word){
TrieNode cur=root;
for(int i=word.length()-1;i>=0;i--){
int c=word.charAt(i)-'a';
if(cur.children[c]==null){
cur.children[c]=new TrieNode();
}
cur=cur.children[c];
}
cur.isWord=true;
}
// 找到 sentence中以endPos为结尾的单词,返回这些单词的开头下标
public List<Integer> search(String sentence,int endPos){
List<Integer> indicies=new ArrayList<>();
TrieNode cur=root;
for(int i=endPos;i>=0;i--){
int c=sentence.charAt(i)-'a';
if(cur.children[c]==null){
break;
}
cur=cur.children[c];
if(cur.isWord){
indicies.add(i);
}
}
return indicies;
}
}