Java语法混乱

时间:2014-05-24 10:31:16

标签: java

给定两个字符串,编写一个方法来判断一个是否是另一个的排列。以下是模型解决方案。我不明白这句话: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;
    }

2 个答案:

答案 0 :(得分:2)

整个想法是确保s中每个字母的数量等于t中每个字母的数量。您可以通过计算s中每个字母的数量,然后再次倒计时,每次在t中出现每个字母。 letters数组执行此操作 - 数组中的每个条目代表st中每个字符可能出现的任意次数。

例如,如果s"AABC"t"BCAA",则在第一个for循环后,letters数组将元素A包含2,元素B包含1,元素C包含1.在第二个for循环后,这些循环都减少为0。

由于您已经检查st的长度相同,如果它们不是完全相同的字母,那么在{中会出现更多次的字母{1}}而不是t。当你到达那封信时,减少字母中相应的值将导致负数,所以你返回false。

相反,如果ss字母完全相同,则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.所有其他可能的条件都将被拒绝,并且该块将不会执行。