1.题目描述


题目解答
这道题告诉了我们一种特殊的数据结构:前缀树。但其实本质上,他就是一种特殊的二叉树,也就是26叉树。
对于题目中的要求,我们可以将字符串转化为字母,再将字母转化为对应的ASCII码值,在节点内部创建一个数组,里面存放孩子节点的引用,每一个索引的位置都对应一个小写字母的ASCII码,只要哪个索引上有孩子节点的引用,就说明下一个字母存在。
我们可以通过遍历一个字符串,来进行添加。在节点内部添加一个布尔值,用于说明是否为一个单词的结尾,当添加完毕的时候,将当前的节点设置为结束的节点。这样当节点遍历完毕的时候,就可以知道到底是不是一个完整的单词。
java
class Trie {
//以字母的acsii码为下标进行计算
public class Node{
Node[] arr = new Node[26];
boolean isend = false;
public Node(){
}
}
Node root = new Node();
public Trie() {
}
public void insert(String word) {
Node node = root;
for(char c : word.toCharArray()){
int index = c-'a';
if(node.arr[index]==null){
node.arr[index] = new Node();
}
node = node.arr[index];
}
node.isend=true;
}
public boolean search(String word) {
Node node = root;
for(char c :word.toCharArray()){
int index = c-'a';
if(node.arr[index]!=null){
node = node.arr[index];
}else{
return false;
}
}
return node.isend;
}
public boolean startsWith(String prefix) {
Node node = root;
for(char c:prefix.toCharArray()){
int index = c-'a';
if(node.arr[index]!=null){
node = node.arr[index];
}else{
return false;
}
}
return true;
}
}
2.题目描述

题目解答


java
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//存放每个节点的入度数组
int[] inarr = new int[numCourses];
//key为目标节点,value为目标节点的后继
Map<Integer,List<Integer>> map = new HashMap<>();
for(int[] rule:prerequisites){
inarr [rule[0]]++;
map.putIfAbsent(rule[1],new ArrayList<>());
map.get(rule[1]).add(rule[0]);
}
Deque<Integer> queue = new ArrayDeque<>();
//先将刚开始所有入度为零的节点入队
for(int i=0;i<inarr.length;i++){
if(inarr[i]==0){
queue.offer(i);
}
}
while(!queue.isEmpty()){
int curNode = queue.poll();
numCourses--;
//遍历当前节点的后继,将每个后继的入度都减一
for(int k:map.getOrDefault(curNode,new ArrayList<>())){
inarr[k]--;
if(inarr[k]==0) queue.offer(k);
}
}
return numCourses == 0;
}
}