Как найти повторяющуюся букву в массиве на C

#arrays #c #duplicates

Вопрос:

Я создаю программу, которая требует от пользователя ввода аргумента (argv[1]), где аргументом является каждая буква алфавита, переставленная так, как это нравится пользователю. Примерами допустимых входных данных являются «YTNSHKVEFXRBAUQZCLWDMIPGJO» и «JTREKYAVOGDXPSNCUIZLFBMWHQ». Примерами недопустимого ввода будут «VCHPRZGJVTLSKFBDQWAXEUYMOI» и «ABCDEFGHIJKLMNOPQRSTUYYYY», поскольку в соответствующих примерах есть дубликаты » V » и «Y».

Что я знаю до сих пор, так это то, что вы можете просмотреть весь аргумент следующим образом

 for (int j = 0, n = strlen(argv[1]); j < n; j  )
{
   //Place something in here...
}
 

Однако я не совсем знаю, будет ли это правильным путем при поиске дубликатов? Кроме того, я хочу, чтобы ответ был как можно более простым, я знаю, что время и загрузка процессора не являются приоритетом, поэтому «лучший» алгоритм не обязательно тот, который я ищу.

Комментарии:

1. В конечном итоге вам потребуется проверить каждый отдельный символ ввода, поэтому для начала неплохо было бы просмотреть их все.

2. Как бы вы это сделали, если бы вам вручили листок бумаги с указанной последовательностью символов, и все, что у вас было, — это еще один лист бумаги и карандаш? Ответьте на это, и у вас будет один (из нескольких) возможных алгоритмов.

3. Самый простой вариант, на мой взгляд, — это вариант использования switch(arg[i]) { регистр ‘A’: int x ; перерыв; и так далее в алфавитном порядке.

4. n = strlen(argv[1] не работает. n=0.

Ответ №1:

предполагая, что все ваши буквы написаны заглавными буквами, вы можете использовать хэш-таблицу, чтобы заставить этот алгоритм работать O(n) со сложностью во времени.

 #include<stdio.h>
#include<string.h>

int main(int argc, char** argv){
    int arr[50]={};

    for (int j = 0, n = strlen(argv[1]); j < n; j  )
    {
        arr[argv[1][j]-'A']  ;
    }

    printf("duplicate letters: ");
    for(int i=0;i<'Z'-'A' 1;i  ){
        if(arr[i]>=2)printf("%c ",i 'A');
    }
}

 

здесь мы создаем массив arr , инициализированный нулями. этот массив будет вести учет вхождений каждой буквы.
а затем мы ищем буквы, которые появлялись 2 или более раз, это дублированные буквы.
Также, используя тот же массив, вы можете проверить, все ли буквы встречались хотя бы один раз, чтобы проверить, является ли это перестановкой

Ответ №2:

Попробовать это.

 #include <stdio.h>
#include <stddef.h>

int main()
{
    char * input = "ABCC";
    size_t ascii[256] = {0, };
    char * cursor = input;
    char c = '';
    while((c=*cursor  ))
    {
        if(ascii[c] == 0)
              ascii[c];
        else
        {
            printf("Find %c has existed.n", c);
            break;
        }
    }

    return 0;
}
 

Ответ №3:

Я не знаю, тот ли это тип кода, который вы ищете, но вот что я сделал. Он ищет дубликаты в данном наборе строк.

 #include <stdio.h>
#include <stdlib.h>
#define max 50

int main() {
   char stringArg[max];
     int dupliCount = 0;
      
      printf("Enter A string: ");
          scanf("%s",stringArg);
               system("cls");

        int length = strlen(stringArg);
for(int i=0; i<length; i  ){
    for(int j=i 1; j<length; j  ){
        if(stringArg[i] == stringArg[j]){
            dupliCount  =1;
        }
    }
}
if(dupliCount > 0)
      printf("Invalid Input");
printf("Valid Input");    
}