给定两个字符串,编写一个方法来判断一个是否是另一个的排列。以下是模型解决方案。我不明白这句话:if(--letters[c]<0) {return false;}
为什么不写if(letters[c]==0){return false;}
有人可以澄清一下。
public boolean permutation(String s, String t) {
if(s.length()!=t.length()) {
return false;
}
int[] letters = new int[256];
char[] s_array = s.toCharArray();
for(char c : s_array){
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 :(得分:2)
整个想法是确保s
中每个字母的数量等于t
中每个字母的数量。您可以通过计算s
中每个字母的数量,然后再次倒计时,每次在t
中出现每个字母。 letters
数组执行此操作 - 数组中的每个条目代表s
和t
中每个字符可能出现的任意次数。
例如,如果s
为"AABC"
且t
为"BCAA"
,则在第一个for
循环后,letters
数组将元素A包含2,元素B包含1,元素C包含1.在第二个for
循环后,这些循环都减少为0。
由于您已经检查s
和t
的长度相同,如果它们不是完全相同的字母,那么在{中会出现更多次的字母{1}}而不是t
。当你到达那封信时,减少字母中相应的值将导致负数,所以你返回false。
相反,如果s
和s
字母完全相同,则t
中的字母数不会多于t
中的字母,因此您永远不会说s
的行 - 所以你最终返回return false;
。
答案 1 :(得分:-1)
此声明表示
if(--letters[c] < 0) {
return false;
}
编译器首先递减索引的值并从数组中获取它。然后它将检查条件的值。如果true
则返回false。
如果值为负整数(小于零),则为true
。也许代码开发人员想要检查值,如果它小于零。您应该注意,Array的索引值从0开始。如果你这样做
System.out.print(letter[0]);
你会得到一个结果。检查是否没有值或其他特定功能。开发人员首先使用减量运算符减小该值,然后检查条件。
--variable
被称为预先减少。
第二个代码块意味着什么。
if(letters[c]==0){
return false;
}
它只会执行且仅当索引c
处的Array值等于0.所有其他可能的条件都将被拒绝,并且该块将不会执行。