I hate this code, but it is faster. You said you are only working with strings made of characters from `a-z`. That means 26 characters. The idea is to use 26 counters, each belonging to a character from `a-z`. Go through the first(second) string, and every time you find a character `c`, you increment(decrement) `c`'s counter by 1. If every counter is zero, that means the strings are permutations of each other, i.e. it's a draw. Otherwise if every counter is non-negative, you'll know that the first string won; if every counter is non-positive, you'll know that the second string won. Finally, if some counters have different signs, then it's again a draw. --- You can check if all the counters are non-negative like so.<br> Set a variable `allnonneg` to true if the first counter is non-negative. Then loop through the remaining counters. If during the \$i\$-th iteration you find a counter, which is negative, then you change `allnonneg` to false. Otherwise you keep `allnonneg` as it is. If in the end `allnonneg` is `true`, then you know that every counter was non-negative. If it's `false`, then you'll know that there was a counter which was negative. This is because the only way the value of `allnonneg` can change is if there is a counter which is negative. To do this manipulation, you need a function `f`, such that `f(allnonneg, charset[i] >= 0)` is `true` precisely when both `allnonneg`, and `charset[i] >= 0` are `true`. Luckily there's already an operator `&&` which does this, so we get allnonneg = f(allnonneg, charset[i] >= 0) = allnonneg && (charset[i] >= 0) which is the same as `allnonneg &= (charset[i] >= 0)`. --- private static int decide(String sa, String sb){ int [] charset = new int[26]; for(int i = 0; i < sa.length(); charset[sa.charAt(i) - 97] ++, i++); for(int i = 0; i < sb.length(); charset[sb.charAt(i) - 97] --, i++); boolean allnonneg = charset[i] >= 0; boolean allnonpos = charset[i] <= 0; for(int i = 1; i < 25; i++) { allnonneg &= (charset[i] >= 0); allnonpos &= (charset[i] <= 0); } if(allnonneg && allnonpos) return 0; // every counter 0 => draw if(allnonneg) return 1; // 1st won if(allnonpos) return 2; // 2nd won else return 0; // mixed signs => draw }