I have created below logic to find if the combination of 2 strings has all the digits from 0-9 at least once. But I think this is very naive and need improvements in performance. Can you please suggest better solution and anything wrong with my solution. Thanks.
Input: Array of strings with digits(Ex: 012345,6789,34567). And I am trying to find how many pairs of strings will have all the digits 0-9 at least once.(In Ex: 1 pair -1st and 2nd).
static long getNumberOfValidPairs(String[] tickets) {
long count=0;
for(int i=0;i<tickets.length-1;i++){
for(int j=i+1;j<tickets.length;j++){
String concat = tickets[i]+tickets[j];
if(concat.length() <10){
continue;
}
if(concat.contains("0") && concat.contains("1") && concat.contains("2") && concat.contains("3") && concat.contains("4") && concat.contains("5") && concat.contains("6") && concat.contains("7") && concat.contains("8") && concat.contains("9")){
count++;
}
}
}
return count;
}
Improved solution:
static long getNumberOfValidPairs(String[] tickets) {
long count=0;
short[] masks = new short[tickets.length];
char[] chs = null;
short mask = 0;
short mask_full = (short) 0b1111111111;
for(int i=0;i<tickets.length;i++){
chs = tickets[i].toCharArray();
mask = 0;
for(char ch:chs){
if (ch >= '0' && ch <= '9') {
int digit = ch - '0';
mask |= (1 << digit);
}
}
masks[i] = mask;
}
for(int i=0;i<tickets.length-1;i++){
short mask_i = masks[i];
for(int j=i+1;j<tickets.length;j++){
short mask_j = masks[j];
short mask_i_j_concatenated = (short) (mask_i | mask_j);
if (mask_i_j_concatenated == mask_full) {
// System.out.println("Strings [" + string_i + "] and [" + string_j + "] form a pair.");
count++;
}
}
}
return count;
}