C: Как найти, что определенное количество символов присутствует в строке в любой последовательности? - PullRequest
0 голосов
/ 07 января 2019

Таким образом, данная задача состоит в том, чтобы создать функцию, которая проверяет любую строку, если

  1. Все 5 букв «a», «b», «c», «d» и «e» включены (в любой последовательность) и
  2. Строка 'abcde' является подстрокой данной строки. Если 1 выполнено (но 2 нет), верните 1. Если оба 1 и 2 верны, верните 2. В противном случае верните 0.

Примеры:

checkabcde(“someaxbxcxdxemm”) -> 1
checkabcde(“someOtherValue”) -> 0
checkabcde(“xyabcdeping”) -> 2
checkabcde(“someaxuxdxlxammabcde”) -> 2

В моем подходе я смог обнаружить, что подстрока «abcde», но не могу определить, что строка содержит «a», «b», «c», «d», «e» в любом последовательность

int checkabcde(char str[]) {

  char str2[] = {
    'a',
    'b',
    'c',
    'd',
    'e'
  };

  char str3[5]; //to be filled with elements from str2 when found inconsecutive order

  int i, z, x, f;

  z = 0; //position for str3
  f = 0; //flag for similarity comparison of str2 and str3

  for (i = 0; i < strlen(str); i++) {
    for (x = 0; x < strlen(str2); x++) {
      if (str[i] == str2[x]) {

        if ((str[i] == 'a') && (str[i + 1] == 'b') && (str[i + 2] == 'c') && (str[i + 3] == 'd') && (str[i + 4] == 'e')) {
          return 2;
        } else {

          if (str3[z] != str[z - 1]) {
            str3[z] = str2[x];
            z++;
          }

        }

      }
    }
  }

  for (i = 0; i < 5; i++) {
    for (x = 0; x < 5; x++) {
      if (str2[i] == str3[x]) {
        f++;
      }
    }
  }

  if (f == 5) {
    return 1;
  } else if (f1 == 0) {
    return 0;
  }
}

редактировать: указатели не допускаются

Ответы [ 4 ]

0 голосов
/ 08 января 2019

В каждом индексе в str цикл sub ищет совпадение подстроки. Если он найден, 2 возвращается. Цикл found проверяет, является ли этот символ, str [index], одним из abcde. Если это так, соответствующий индекс в массиве check устанавливается на пробел.
После обработки всех символов в str сравните abcde с check. Если есть совпадение, этот соответствующий символ отсутствует в str. Возврат 0.

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

int checkabcde ( char str[]) {
    char abcde[] = "abcde";
    char check[] = "abcde";
    int index = 0;
    int match = 1;
    int length = strlen ( str);
    int span = strlen ( abcde);

    while ( str[index]) {
        if ( str[index] == abcde[0]) {
            match = 1;
            for ( int sub = 0; sub < span; ++sub) {
                if ( index + sub > length || str[index + sub] != abcde[sub]) {
                    match = 0;
                    break;
                }
            }
            if ( match) {
                return 2;
            }
        }
        for ( int found = 0; index + found < length && found < span; ++found) {
            if ( str[index + found] == abcde[found]) {
                check[found] = ' ';
            }
        }
        index++;
    }
    for ( int found = 0; found < span; ++found) {
        if ( check[found] == abcde[found]) {
            return 0;
        }
    }
    return 1;
}

int main( void) {
    char lines[][30] = {
        "someaxbxcxdxemm"
        , "someOtherValue"
        , "xyabcdeping"
        , "someaxuxdxlxammabcde"
        , "vu4ndljeibn2c9n@aiendjba"
        , "dbcaeddeaabcceabcde"
    };

    for ( int each = 0; each < 6; ++each) {
        printf ( "for [%s] result = %d\n", lines[each], checkabcde ( lines[each]));
    }
    return 0;
}
0 голосов
/ 07 января 2019

Попробуйте что-то вроде этого:

int checkabcde(char str[]) {

    // Check if string contains substring "abcde"
    if (strstr(str, "abcde") != NULL) {
        return 2;
    }

    int charCounts[5] = {0, 0, 0, 0, 0};
    int length = strlen(str);
    int i = 0;

    // Keep counts of each occurrence of a,b,c,d,e
    for(; i < length; i++) {
        // If "abcde" contains the current character
        if (strchr("abcde", str[i]) != NULL) {
            charCounts[str[i] - 'a']++;
        }
    }

    i = 0;

    // Check if any of the counts for a,b,c,d,e are 0
    for (; i < 5; i++) {
        if (charCounts[i] == 0) {
            return 0;
        }
    }

    // Otherwise we must have found at least 1 of each a,b,c,d,e
    return 1;
}
0 голосов
/ 08 января 2019
  1. Для 1, вы можете использовать f[256] установить f[ch] = 1 для всех символов в s1, а затем проверить f[ch] == 1 для каждого символа в s2
  2. Для 2 вы можете использовать strstr() см. http://man7.org/linux/man-pages/man3/strstr.3.html

Может работать следующее code:

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

int check(const char* s1, const char* s2) {
  int f[256];
  memset(f, 0, sizeof(f));

  // check 1
  for (int i = 0; s1[i] != '\0'; ++i)
    f[s1[i]] = 1;
  for (int i = 0; s2[i] != '\0'; ++i)
    if (f[s2[i]] == 0)
      return 0;
  // check 2
  return strstr(s1, s2) == NULL ? 1 : 2;
}

int main(void) {
  printf("%d\n", check("someaxbxcxdxemm",      "abcde"));
  printf("%d\n", check("someOtherValue",       "abcde"));
  printf("%d\n", check("xyabcdeping",          "abcde"));
  printf("%d\n", check("someaxuxdxlxammabcde", "abcde"));
  return 0;
}
0 голосов
/ 07 января 2019

Вы можете использовать отдельную структуру для проверки отдельных символов в дополнение к поиску подстроки.

Массив из пяти bools может быть использован для хранения подарка каждого персонажа. например:

bool chars[5] = {false};

for (int i = 0; i < strlen(str); i++) {
    char c = str[i];
    switch(c) {
        case 'a':
            chars[0] = true;
            break;
        case 'b':
            chars[1] = true;
            break;
        // include cases for each character you are looking for
    }
}

Если в конце каждая запись в массиве chars истинна, вы знаете, что строка содержит все символы.

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

Вы также можете посмотреть некоторые другие методы проверки, содержит ли строка определенную подстроку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...