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.
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 = true;
boolean allnonpos = true;
for(int i = 0; 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
}