我必须找到一种方法来检查两个字符串(如果它们是字谜)。如果是,则该方法应返回true和false。由于我无法自行找到合适的方法,因此我发现了Rodney Shaghoulian(Github:github.com/RodneyShag,HackerRank:hackerrank.com/RodneyShag)可以工作的另一段代码:< / p>
import java.io.*;
import java.util.*;
public class Solution {
static boolean isAnagram(String a, String b) {
if (a == null || b == null || a.length() != b.length()) {
return false;
}
a = a.toLowerCase();
b = b.toLowerCase();
HashMap<Character, Integer> map = new HashMap<>();
/* Fill HashMap with 1st String */
for (int i = 0; i < a.length(); i++) {
char ch = a.charAt(i);
map.merge(ch, 1, Integer::sum);
}
/* Compare 2nd String to 1st String's HashMap */
for (int i = 0; i < b.length(); i++) {
char ch = b.charAt(i);
if (map.containsKey(ch) && map.get(ch) > 0) {
map.put(ch, map.get(ch) - 1);
} else {
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String a = scan.next();
String b = scan.next();
scan.close();
boolean ret = isAnagram(a, b);
System.out.println( (ret) ? "Anagrams" : "Not Anagrams" );
}
}
我只是将其复制并粘贴到自己的IDE中,但是在第18行出现了三个编译错误:
map.merge(ch, 1, Integer::sum);
说
')' expected,
illegal start of expression,
error: ';' expected.
我不了解,因为我没有看到任何括号或缺少任何内容。该代码显然也对作者有效。 谁能帮助我解决问题?
还可以在不使用哈希图的情况下比较两个字符串以查看它们是否为字谜吗?可能使用字符串作为char []方法和for循环吗? (这是我想出的原始方式,我对哈希图一点都不熟悉。)
答案 0 :(得分:1)
首先,此代码没问题并且可以在我的环境中很好地运行,您可以使用java -version
这是我的JDK版本
$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
Lambda表达式Integer::sum
是JDK8和更高版本支持的功能,如果您使用的是1.8以下的JDK版本,则无法成功编译;
然后,让我们谈谈字谜:
我们可以使用一个数组,该数组是字符的索引,然后计算字符串中每个字符的出现次数。在第一个字符串中,出现的每个字符都将添加到相应的数组位置。在第二个字符串中,出现的每个字符都从数组的相应位置中减去一个。因此,我们要做的是遍历第一个字符串,遍历第二个字符串,并且这两个字符串都将成为Anagrams的唯一方法是,如果该数组仍为全0。这意味着一个两个字符串中的相同字符数。
-
public class CustomStringUtil {
public static boolean secondIsAnagram(String sFirst, String sSecond) {
if (sFirst.length() != sSecond.length()) {
return false;
}
int[] asciiChars = new int[256];
for (int i = sFirst.length() - 1; i >= 0; --i) {
++asciiChars[sFirst.charAt(i)];
}
for (int i = sFirst.length() - 1; i >= 0; --i) {
char currChar = sSecond.charAt(i);
if (asciiChars[currChar] == 0) {
return false;
}
--asciiChars[currChar];
}
return true;
}
}