【发布时间】:2017-05-05 15:43:28
【问题描述】:
我有一个单词列表如下。
pear
amleth
dormitory
tinsel
dirty room
hamlet
listen
silnet
我想找出所有字谜并按排序顺序列出它们。如果什么也没找到,就输出那个词。所以在上述情况下,输出应该是。
amleth,hamlet
dirty room,dormitory
listen,silnet,tinsel
pear
下面是我为此编写的 java 代码。
public class Anagram {
private boolean isAnagram(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
Map<Character, Integer> anagramMap = new HashMap<>();
for (char ch = 'a'; ch <= 'z'; ++ch)
anagramMap.put(ch, 0);
for(int i=0; i<s1.length(); i++){
anagramMap.put(s1.charAt(i), anagramMap.get(s1.charAt(i))+1);
}
for(int j=0; j<s2.length(); j++) {
if (anagramMap.get(s2.charAt(j)) != 0) {
anagramMap.put(s2.charAt(j), anagramMap.get(s2.charAt(j)) - 1);
}
}
for(int value : anagramMap.values()) {
if (value != 0) {
return false;
}
}
return true;
}
private void solveChallenge(List<String> words) {
for(int i=0 ;i<(words.size()-1); i++) {
Set<String> result = new TreeSet<>();
for(int j=(i+1); j< words.size(); j++) {
if (isAnagram(words.get(i), words.get(j))){
result.add(words.get(i) + " " + words.get(j));
System.out.println(result);
words.remove(j);
}
}
}
}
public static void main(String[] args) {
Anagram anagram = new Anagram();
List<String> words = new ArrayList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
String line = reader.readLine();
Integer numTestCases = Integer.parseInt(line);
while (--numTestCases >= 0){
words.add(reader.readLine().replaceAll("\\s+","").toLowerCase());
}
System.out.println(words);
new Anagram().solveChallenge(words);
} catch (IOException e) {
e.printStackTrace();
}
}
}
但它没有列出所需的输出。我得到的输出是
[amleth hamlet]
[dormitory dirtyroom]
[tinsel lisetn]
谁能告诉我这里出了什么问题?
【问题讨论】:
-
但它没有列出所需的输出。你能显示你得到的输出吗?
-
我不明白你怎么能期望你的程序产生你描述的输出。它成对地比较和输出结果,但您希望容纳超过两个字谜的组。此外,您从输入的单词中去除空格;这些都丢失了——当你输出结果时你无法重现它们。此外,您根本没有任何机制来输出不是任何其他输入的字谜的输入。 您需要一种完全不同的方法。
-
考虑在阅读输入时形成相互字谜组,并延迟输出直到阅读并分组整个输入。
-
虽然我确信您的
isAnagram方法可以正常工作,但检查字谜的标准方法是对字母进行排序并比较排序顺序。由于 amleth 和 hamlet 都产生 aehlmt,因此它们是字谜。另一个优点是您可以使用 `Map> 来保存字谜,因此所有的 listen、silnet 和 tinsel 都将存储在 eilnst 键下。 -
boolean isAnagram(String a, String b) { char[] ca = a.toCharArray(); char[] cb = b.toCharArray(); Arrays.sort(ca); Arrays.sort(cb); return Arrays.equals(ca,cb);}
标签: java algorithm data-structures collections