Java 使用字符数组时排列检查器的输出不正确

Java 使用字符数组时排列检查器的输出不正确,java,string,Java,String,我有下面的代码返回一个布尔值,指示一个字符串是否可以是另一个字符串的置换。 假设我们使用的是ASCII字符集 当传递以下两个字符串时,输出仍然为true System.out.println(checkPermutation(“dog”,“odf”)) 少了什么 public static boolean checkPermutation(String s1, String s2) { if(s1.length() != s2.length()) { return fa

我有下面的代码返回一个布尔值,指示一个字符串是否可以是另一个字符串的置换。 假设我们使用的是ASCII字符集

当传递以下两个字符串时,输出仍然为true System.out.println(checkPermutation(“dog”,“odf”))

少了什么

public static boolean checkPermutation(String s1, String s2) {

    if(s1.length() != s2.length()) {
        return false;
    }

    char[] letters = new char[128];
    for(char c : s1.toCharArray()) {
        letters[c]++;
    }

    for(int i = 0; i < s2.length(); i++) {
        int c = (int) s2.charAt(i);
        letters[c]--;
        if(letters[c] < 0) {
            return false;
        }
    }
    return true;
}
公共静态布尔校验置换(字符串s1、字符串s2){
如果(s1.length()!=s2.length()){
返回false;
}
字符[]个字母=新字符[128];
for(字符c:s1.toCharArray()){
字母[c]++;
}
对于(int i=0;i
只是给你一个想法。您可以使用字符串的
indexOf
方法查找两个字符串中是否都存在字符:

for (int i = 0; i < s2.length(); i++) {
    if (s1.indexOf(s2.charAt(i)) == -1) {
        return false;
    }
}
for(int i=0;i
您的问题似乎是使用字符数组来存储出现次数,而不是整数数组(我猜
字母[c]
永远不会小于零,因为字符不能小于零)。我修改了你的代码,这应该可以:

public static boolean checkPermutation(String s1, String s2) {

    if(s1.length() != s2.length()) {
        return false;
    }

    int [] letters = new int[128];
    for(char c : s1.toCharArray()) {
        letters[c]++;
    }

    for(int i = 0; i < s2.length(); i++) {
        int c = (int) s2.charAt(i);
        letters[c]--;
        if(letters[c] < 0) {
        return false;
        }
    }
    return true;
}
公共静态布尔校验置换(字符串s1、字符串s2){
如果(s1.length()!=s2.length()){
返回false;
}
int[]字母=新int[128];
for(字符c:s1.toCharArray()){
字母[c]++;
}
对于(int i=0;i
@NimitPatel:Java数组元素(以及类和实例字段)总是初始化为适当的零,而
char
的值是
'\u0000'
请特别注意(Java)
char
是无符号的,因此递减
(char)0
会得到字符
\uFFFF
,它是