@ Реализация Бромана хороша и рекурсивна.Я включаю нерекурсивную реализацию.Алгоритм: сканирование строки от начала до конца: если индекс текущего символа совпадает с поиском в начале (strchr), а также в конце (strrchr), то этот символ уникален.иначе я возвращаю '-', если нет ничего уникального.(Это может быть изменено в зависимости от вашего приложения)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
char first_unique_char(const char* s);
int main()
{
char s[] = "abcdefghijtkqyabcdefghijkqx";
char unique = first_unique_char(s);
printf("The first unique char is %c\n",
unique);
return EXIT_SUCCESS;
}
// -----------------------------
char first_unique_char(const char* s)
{
int i = 0;
char* loc_forward = NULL;
char* loc_backward = NULL;
int len = strlen(s);
bool found = false;
printf("Len = %d\n", len);
for(; i < len; i++)
{
loc_backward = strrchr(s, s[i]);
loc_forward = strchr(s, s[i]);
printf("i = %d, Char = %c, Loc_rev: %d, Loc_forward %d\n",
i, s[i], (int)(loc_backward - s), (int)(loc_forward - s));
if ((loc_backward - s == i) && (loc_forward - s == i))//unique
{
found = true;
break;
}
}
printf("Returning at %d, s[i] = %c\n", i, s[i]);
if (!found)
return '-';
else
return s[i];
}
Вывод:
Len = 27
i = 0, Char = a, Loc_rev: 14, Loc_forward 0
i = 1, Char = b, Loc_rev: 15, Loc_forward 1
i = 2, Char = c, Loc_rev: 16, Loc_forward 2
i = 3, Char = d, Loc_rev: 17, Loc_forward 3
i = 4, Char = e, Loc_rev: 18, Loc_forward 4
i = 5, Char = f, Loc_rev: 19, Loc_forward 5
i = 6, Char = g, Loc_rev: 20, Loc_forward 6
i = 7, Char = h, Loc_rev: 21, Loc_forward 7
i = 8, Char = i, Loc_rev: 22, Loc_forward 8
i = 9, Char = j, Loc_rev: 23, Loc_forward 9
i = 10, Char = t, Loc_rev: 10, Loc_forward 10
Returning at 10, s[i] = t
The first unique char is t
Process returned 0 (0x0) execution time : 0.016 s
Press any key to continue.