我正在研究一个涉及字符串的非常常见的Java问题的解决方案。我想写一个方法来查看字符串是否是另一个字符串的排列(anagram)。
我的解决方案是:我正在编写一个需要两个字符串的方法。我遍历一个String并将找到的字符放入HashMap,其中键是字母,值是该字母的出现次数,作为int。一旦我完成迭代第一个String,我迭代第二个String并减少在同一个HashMap中找到的每个字符的值。
一旦键达到零,我将从HashMap中完全删除键/值对。一旦我完成迭代第二个String,我就只检查HashMap是否为空。如果是,则两个字符串是彼此的排列/字谜,否则该方法返回false。
我的方法如下:
public boolean checkPermutation (String stringA, String stringB) {
if (stringA.length() != stringB.length()) {
return false;
}
else {
HashMap alpha = new HashMap();
for (int i = 0; i < stringA.length(); i++) {
if (!alpha.containsKey(stringA.charAt(i))) {
alpha.put(stringA.charAt(i), 0);
}
else {
Integer value = (Integer) alpha.get(stringA.charAt(i));
int newValue = value.intValue();
alpha.put(stringA.charAt(i), newValue++);
}
}
for (int j = 0; j < stringB.length(); j++) {
if (alpha.containsKey(stringB.charAt(j))) {
Integer value = (Integer) alpha.get(stringA.charAt(j));
int newValue = value.intValue();//null pointer exception here
if (newValue > 1) {
alpha.put(stringB.charAt(j), newValue--);
}
else {
alpha.remove(stringB.charAt(j));
}
}
}
if (alpha.isEmpty())
return true;
else
return false;
}
}
我的问题是我的解决方案区分大小写(即如果我输入“Hello”和“oellH”,我会得到一个空指针异常)。我想让这个解决方案不区分大小写,并弄清楚为什么我得到一个空指针异常。谁能看到我做错了什么?
作为一个小的后续问题,尽管存在两个for循环,但这种O(n)类型的解决方案是什么?
答案 0 :(得分:1)
Integer value = (Integer) alpha.get(stringA.charAt(j));
尝试将stringA更改为stringB。
Integer value = (Integer) alpha.get(stringB.charAt(j));
因为如果给出不同的字符串,其中没有相同的字符,则该值将为null,并且将通过NPE。
将两个字符串更改为小写或大写。
stringA= stringA.toLowercase();
stringB= stringB.toLowercase();
答案 1 :(得分:1)
抛出空指针异常,因为您正在检查hashmap中stringB的char,然后提取stringA的值,可能有可能在此时从hashmap中删除该特定值时抛出空指针错误。
如果您在
中仔细调试代码if (alpha.containsKey(stringB.charAt(j))) {
Integer value = (Integer) alpha.get(stringA.charAt(j));
///Your code
}
将其更改为
if (alpha.containsKey(stringB.charAt(j))) {
Integer value = (Integer) alpha.get(stringB.charAt(j));
///Your code
}
对于你的另一个问题,使它不区分大小写,在开始操作之前将小写字母大小写为大写
stringA = stringA.toLowerCase();
stringB = stringB.toLowerCase();