Слово минимальной длины в строке (C ++) - PullRequest
0 голосов
/ 07 мая 2020

Учитывая строку S (которая может содержать несколько слов), вам нужно найти слово с минимальной длиной. Примечание. Если несколько слов имеют одинаковую длину, ответом будет первое слово минимальной длины в строке. Слова разделяются только одним пробелом.

Input Format :
String S
Output Format :
Minimum length word
Constraints :
1 <= Length of String S <= 10^5
Sample Input 1 :
this is test string
Sample Output 1 :
is
Sample Input 2 :
abc de ghihjk a uvw h j
Sample Output 2 :
a

Пожалуйста, проверьте, что не так. На выходе ничего не поступает.

Вот код:

   /* input - Input String
*  output - Save the result in the output array (passed as argument). You don’t have to 
*  print or return the result
*/

int length(char input[], int si, int ei){
    int len = 0;
    for(int i = si; i <= ei; i++){
        len++;
    }
    return len;

}

char getString(char input[], int index){
    return input[index];
}

void minLengthWord(char input[], char output[]){
    int prev = -1;
    int i = 0;
    int minLength = 0, len = 0;
    int si, ei;
    for(; input[i] != '\0'; i++){
        if(input[i] == ' '){
            int len = length(input, prev + 1, i - 1);
            if(len > minLength){
                minLength = len;
                si = prev + 1;
                ei = i - 1;
            }
            prev = i;
        }

    }
    length(input, prev + 1, i - 1);
    if(len > minLength){
                minLength = len;
                si = prev + 1;
                ei = i - 1;
            }
    for(int i = 0; i < minLength; i++){
         output[i] = getString(input, si + i);
    }


    // Write your code here 

}

1 Ответ

0 голосов
/ 07 мая 2020

Фактически это задание на проверку знаний стандартных C строковых функций.

Код, указанный в вопросе, не имеет смысла.

Например, внутри функции length

int length(char input[], int si, int ei){
    int len = 0;
    for(int i = si; i <= ei; i++){
        len++;
    }
    return len;

}

параметр input не используется. L oop внутри функции является избыточным. Функцию можно определить проще, например,

int length( int si, int ei )
{
    return ei - si + 1;
}

Или в функции minLengthWord оператор this if

        if(len > minLength){
            minLength = len;

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

Лучший способ определить функцию - определить ее таким образом, чтобы она возвращала позицию и длину минимального слова в данной строке. Имея такую ​​информацию, вы всегда можете легко извлечь минимальное слово, если оно потребуется.

Вот демонстрационная программа.

#include <iostream>
#include <utility>
#include <cstring>

std::pair<size_t, size_t> minimum_word( const char *s, const char *delim = " \t" )
{
    std::pair<size_t, size_t> min = { 0, 0 };

    size_t i = 0;
    while ( *( s + i ) )
    {
        i += std::strspn( s + i, delim );

        if ( *( s + i ) )
        {
            size_t n = std::strcspn( s + i, delim );

            if ( min.second == 0 || n < min.second  )
            {
                min.first  = i;
                min.second = n;
            }

            i += n;
        }
    }

    if ( min.second == 0 ) min.first = i;

    return min;
}

int main() 
{
    const char *s = "Hello John Bradely";

    auto min = minimum_word( s );

    std::cout << "The minimum word is "; 
    std::cout.write( s + min.first, min.second ) << '\n';

    return 0;
}

Результат программы:

The minimum word is John

Показанную функцию легко изменить так, чтобы она возвращала динамически созданный массив, в который будет скопировано минимальное слово.

#include <iostream>
#include <utility>
#include <cstring>

char * minimum_word( const char *s, const char *delim = " \t" )
{
    std::pair<size_t, size_t> min = { 0, 0 };

    size_t i = 0;
    while ( *( s + i ) )
    {
        i += std::strspn( s + i, delim );

        if ( *( s + i ) )
        {
            size_t n = std::strcspn( s + i, delim );

            if ( min.second == 0 || n < min.second  )
            {
                min.first  = i;
                min.second = n;
            }

            i += n;
        }
    }

    if ( min.second == 0 ) min.first = i;

    char *word = new char[min.second + 1]();

    std::memcpy( word, s + min.first, min.second );

    return word;
}

int main() 
{
    const char *s = "Hello John Bradely";

    char *word = minimum_word( s );


    std::cout << "The minimum word is " << word << '\n'; 

    delete [] word;

    return 0;
}

Результат программы:

The minimum word is John
...