The challenge

Write a program to determine if a string contains only unique characters. Return true if it does and false otherwise.

The string may contain any of the 128 ASCII characters. Characters are case-sensitive, e.g. ‘a’ and ‘A’ are considered different characters.

The solution in C

Option 1:

1
2
3
4
5
int has_unique_chars(const char *str) {
  int mask[128]={0};
  while (*str) if (++mask[*str++]>1) return 0;
  return 1;
}

Option 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <limits.h>

_Bool has_unique_chars(const char *str) {
    char hit[CHAR_MAX + 1] = {0};
    while (*str) {
        if (*str < 0) { str++; continue; }
        if (hit[*str]) return 0;
        hit[*str++] = 1;
    }
    return 1;
}

Option 3:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdbool.h>
#include <string.h>
#include <stdio.h>

bool has_unique_chars(const char *str) {
  size_t len = strlen(str);
  char *list = malloc(len);
  for (int i = 0; i < len; i++) {
    for (int z = 0; z < i; z++) {  
      if (*(list + z) == str[i]) {
        return false;  
      }
    }
    *(list + i) = str[i];
  }
  return true;
}

Test cases to validate our solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <criterion/criterion.h>

bool has_unique_chars(const char *str);

Test(has_unique_chars, test_example) {
    cr_assert_not(has_unique_chars("  nAa"));
    cr_assert(has_unique_chars("abcde"));
    cr_assert_not(has_unique_chars("++-"));
    cr_assert(has_unique_chars("AaBbC"));
}