类型:字典树
思路:将所有单词插入字典树,然后对每个单词进行lenth次的拆分,然后就在树上暴力找就行了,找到就输出,注意对每个单词不可输出两次
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
Trie trie = new Trie();
String a[] = new String[50005];
int bj = 0;
while (kb.hasNext()) {
a[bj] = kb.next();
trie.insert(a[bj]);
bj++;
}
for (int i = 0; i < bj; i++) {
for (int j = 1; j < a[i].length(); j++) {
if (trie.search(a[i].substring(0, j)) && trie.search(a[i].substring(j, a[i].length()))) {
System.out.println(a[i]);
break;
}
}
}
kb.close();
}
}
class Trie {
private int SIZE = 26;
private TrieNode root;
private int nodesum;
Trie() {
root = new TrieNode();
nodesum = 0;
}
private class TrieNode {
private int num;
private TrieNode[] son;
private boolean isEnd;
private char val;
TrieNode() {
num = 1;
son = new TrieNode[SIZE];
isEnd = false;
}
}
//建立字典树
public void insert(String str) // 在字典树中插入一个单词
{
if (str == null || str.length() == 0) {
return;
}
TrieNode node = root;
char[] letters = str.toCharArray();
for (int i = 0, len = str.length(); i < len; i++) {
int pos = letters[i] - 'a';
if (node.son[pos] == null) {
node.son[pos] = new TrieNode();
node.son[pos].val = letters[i];
nodesum++;
} else {
node.son[pos].num++;
}
node = node.son[pos];
}
node.isEnd = true;
}
public boolean search(String str) {
if (str == null || str.length() == 0) {
return false;
}
TrieNode node = root;
char[] letters = str.toCharArray();
for (int i = 0, len = str.length(); i < len; i++) {
int pos = letters[i] - 'a';
if (node.son[pos] == null) {
return false;
}
node = node.son[pos];
}
return node.isEnd;
}
public TrieNode getRoot() {
return this.root;
}
}