UVA10391 复合词 Compound Words
题目描述

输入格式

输出格式

输入输出样例 #1
输入 #1
java
a
alien
born
less
lien
never
nevertheless
new
newborn
the
zebra
输出 #1
java
alien
newborn
题目大意
你需要找出词典中所有由两个单词构成的复合词。双词复合词指词典内的某个单词,该单词恰好由词典中另外两个单词拼接而成。
输入格式
标准输入包含若干小写单词,每行一个,单词按字母顺序排列,单词总数不超过 120000 个。
输出格式
你需要输出所有符合条件的复合词,每行输出一个,保持字母升序排列。
解题思路
先读取所有单词,一份存入哈希集合方便快速查找,另一份存入顺序列表保留原本输入次序。之后逐个取出列表里的单词,尝试在不同位置把单词切割成前后两段,只要有一种切分方式得到的两段文字都存在于集合里,就认定这个词是复合词并进行输出。这段代码还有一处问题,切割起点不能从零开始,不然会切出空字符串导致判断出错。
完整代码
java
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class CompoundWords {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Set<String> words = new HashSet<String>();
ArrayList<String> wordList = new ArrayList<>();
while(sc.hasNextLine()) {
String word = sc.nextLine().trim();
words.add(word);
wordList.add(word);
}
sc.close();
for (int i = 0; i < wordList.size(); i++) {
String currentWord = wordList.get(i);
boolean flag = false;
for(int j = 0; j < currentWord.length() ; j++) {
String left = currentWord.substring(0, j);
String right = currentWord.substring(j);
if(words.contains(left) && words.contains(right)) {
flag = true;
break;
}
}
if(flag) {
System.out.println(currentWord);
}
}
}
}
测评结果
