class StreamChecker { TrieNode root; TrieNode temp; public StreamChecker(String[] words) { root = new TrieNode(); for (String word : words) { TrieNode cur = root; for (int i = 0; i < word.length(); i++) { int index = word.charAt(i) - 'a'; if (cur.getChild(index) == null) { cur.setChild(index, new TrieNode()); } cur = cur.getChild(index); } cur.setIsEnd(true); } root.setFail(root); Queue<TrieNode> q = new LinkedList<>(); for (int i = 0; i < 26; i++) { if(root.getChild(i) != null) { root.getChild(i).setFail(root); q.add(root.getChild(i)); } else { root.setChild(i, root); } } while (!q.isEmpty()) { TrieNode node = q.poll(); node.setIsEnd(node.getIsEnd() || node.getFail().getIsEnd()); for (int i = 0; i < 26; i++) { if(node.getChild(i) != null) { node.getChild(i).setFail(node.getFail().getChild(i)); q.offer(node.getChild(i)); } else { node.setChild(i, node.getFail().getChild(i)); } } } temp = root; } public boolean query(char letter) { temp = temp.getChild(letter - 'a'); return temp.getIsEnd(); } } class TrieNode { TrieNode[] children; boolean isEnd; TrieNode fail; public TrieNode() { children = new TrieNode[26]; } public TrieNode getChild(int index) { return children[index]; } public void setChild(int index, TrieNode node) { children[index] = node; } public boolean getIsEnd() { return isEnd; } public void setIsEnd(boolean b) { isEnd = b; } public TrieNode getFail() { return fail; } public void setFail(TrieNode node) { fail = node; } }
时间: 2023-05-22 22:07:03 浏览: 42
这是一个实现 Trie 树的代码,并且包含了 AC 自动机的实现,用于查询一个字符流中是否出现了 Trie 树中的某个单词。该代码中包含了主要的数据结构 TrieNode 和 StreamChecker 类,其中 StreamChecker 类包含了 query() 方法用于查询字符流,该方法的返回值为出现单词的情况。如果字符流中出现了某个单词,该方法返回 true,否则返回 false。TrieNode 类则包含了实现 Trie 树的相关方法,例如 getChild() 和 setChild() 方法用于获取和设置子节点。
相关问题
package endTest; import java.util.Scanner; import java.util.HashMap; public class ArrayDistinct { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入一句英语:"); String input = scanner.nextLine(); scanner.close(); String[] words = input.split("\\W+"); HashMap<String, Integer> map = new HashMap<String, Integer>(); for (String word : words) { if (map.containsKey(word)) { map.put(word, map.get(word) + 1); } else { map.put(word, 1); } } for (String word : map.keySet()) { System.out.println(word + ": " + map.get(word)); } } }用HashMap再写一遍
好的,这里是使用 HashMap 实现的代码:
```java
import java.util.Scanner;
import java.util.HashMap;
public class ArrayDistinct {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一句英语:");
String input = scanner.nextLine();
scanner.close();
String[] words = input.split("\\W+");
HashMap<String, Integer> map = new HashMap<String, Integer>();
for (String word : words) {
if (map.containsKey(word)) {
map.put(word, map.get(word) + 1);
} else {
map.put(word, 1);
}
}
for (String word : map.keySet()) {
System.out.println(word + ": " + map.get(word));
}
}
}
```
这个程序的功能和之前的一样,只是使用了 HashMap 来实现。其中,HashMap 的 key 是单词,value 是该单词在输入字符串中出现的次数。在遍历输入字符串时,对于每个单词,如果它已经在 HashMap 中出现过了,就将它的 value 值加一;否则,就将它添加到 HashMap 中,并将它的 value 值设为 1。最后,遍历 HashMap,输出每个单词以及它的出现次数。
分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package lexer; public class Word extends Token { public String lexeme = ""; public Word(String s, int tag) { super(tag); lexeme = s; } public String toString() { return lexeme; } public static final Word and = new Word( "&&", Tag.AND ), or = new Word( "||", Tag.OR ), eq = new Word( "==", Tag.EQ ), ne = new Word( "!=", Tag.NE ), le = new Word( "<=", Tag.LE ), ge = new Word( ">=", Tag.GE ), minus = new Word( "minus", Tag.MINUS ), True = new Word( "true", Tag.TRUE ), False = new Word( "false", Tag.FALSE ), temp = new Word( "t", Tag.TEMP ); }
and", Tag.AND);
public static final Word or = new Word("or", Tag.OR);
public static final Word eq = new Word("==", Tag.EQ);
public static final Word ne = new Word("!=", Tag.NE);
public static final Word le = new Word("<=", Tag.LE);
public static final Word ge = new Word(">=", Tag.GE);
public static final Word minus = new Word("-", Tag.MINUS);
public static final Word True = new Word("true", Tag.TRUE);
public static final Word False = new Word("false", Tag.FALSE);
该类继承自Token类,是用于表示源代码中的单词的类。其中包括一个表示单词字符串的成员变量lexeme和一个构造函数,用于初始化单词字符串和标记。该类还重写了父类的toString方法,使其返回单词字符串。
该类还定义了一些静态成员变量,用于表示一些特殊的单词,如and、or、eq等。这些静态成员变量在整个词法分析器中都会被使用到。
总的来说,Word类是词法分析器中的一个重要类,它用于表示源代码中的单词,并提供了一些常用的单词的静态表示方式。