我正在尝试理解用于检查两个字符串是否是排列的代码(区分大小写和空格很重要,使用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;
}
答案 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}}这里是不匹配的。