字符串排列声明澄清

时间:2015-07-24 19:46:24

标签: java arrays string

我正在尝试理解用于检查两个字符串是否是排列的代码(区分大小写和空格很重要,使用ASCII字符)。此代码生成一个int数组,并计算每个char出现在's'中的次数,并将此计数放入int数组中。然后我对if声明感到困惑:if (--letters[c] < 0)。为什么减少计数?如果字母不在数组中则表示计数必须为0?但是这if (letters[c] == 0)不起作用,为什么?我不明白

public boolean permutation(String s, String t) {

    if (s.length() != t.length()) {
        return false;
    }

    int[] letters = new int[256]; // Assumption

    char[] s_array = s.toCharArray();

    for (char c : s_array) { // count number of each char in s.
        letters[c]++;
    }

    for (int i = 0; i < t.length(); i++) {
        int c = (int) t.charAt(i);
        if (--letters[c] < 0) {
            return false;
        }
    }

    return true;
}

2 个答案:

答案 0 :(得分:-1)

您发布的代码使用数组作为哈希表的形式 它基本上保存了每个字符的ascii int值(0-255),当它越过第一个字符串时,它相应地增加每个字符。
所以abca是97,98,99,97所以数组将有

letters[97] = 2,  
letters[98] = 1,  
letters[99] = 1  

因为它越过第二个字符串t如果出现更多字符,则减量将低于0,因此它不是排列。
所以a,a,b,c是97,97,98,99

letters[97] = 2 -1 -1 = 0,  
letters[98] = 1 -1 = 0,  
letters[99] = 1 - 1 = 0  

a,a,a,b为97,97,97,98

字母[97] = 2 -1 -1 -1 = -1,
字母[98] = 1,
字母[99] = 1

所以不是排列。

这是一个不错的代码段,但仅适用于ascii字符串

答案 1 :(得分:-2)

 if (--letters[c] < 0) {
     return false;
    }

在上一步中,您已经在尊重的位置上增加了字符。 现在要交叉检查另一个字符串,你减少相同的相应位置。如果相同位置上的字符串的数字是精确的,它将保留精确的0。

  

&#34;为什么字母[c] == 0不起作用&#34;

因为相应的任何先前未占用的位置将默认为0.意味着,如果是非匹配的char,您将减少char的位置,该位置将为0-1 = -1&lt ; 0。

<强>更新

只有一个常见的数组:字母。您正在增加特定字符位置1st的计数。例如。如果是{'1','2','3'},则会增加位置:letters[49]++ ,letters[50]++,letters[51]++。现在让我们取其他字符串:{'1','2','3','4'}:在这种情况下:letters[49]-- ,letters[50]--,letters[51]-- all将再次为0。但对于char&#39; 4&#39;我们将letters[52]--&lt; {1}}这里是不匹配的。