Найти слово из файла, в котором встретится больше всего букв из слова, введённого с клавиатуры

285
12 апреля 2018, 13:27

Имеется файл, в нём написаны слова. С клавиатуры вводится слово с неповторяющимися буквами. Найти и вывести слово из файла, в котором встретится больше всего букв из слова, введённого с клавиатуры. Никак не могу понять, как можно это реализовать в программе... Кто-нибудь, подскажите, пожалуйста, возможный алгоритм, желательно без использования изощрённых процедур и малоизвестных библиотек. Что лучше использовать: стринги или чары?

Answer 1

Пример функции, которая возвращает количество совпадающих символов в строке s из строки sub:

size_t overlap(const string& s, const string& sub)
{
    size_t  k = 0, sz = sub.size();
    for (size_t n = 0; n < sz; ++n){
        k += std::count(s.begin(), s.end(), sub[n]);
    }
    return k;
}

Попытайтесь самим написать программу.

Answer 2

Ввести слово, внести символы из слова в std::set

Для каждого слова из файла посчитать, сколько символов из него есть в set

Answer 3

Вводите слово-образец. В цикле, пока не получите отказ, читаете файл пословно, используя fscanf() Потом для каждой буквы слова проверяете, содержится ли она в образце? используя strchr(). Если содержится добавляете в счетчик. Если слово содержит больше символов из образца, чем предыдущее, сохраняете его. Когда все слова из файла прочитаны, у вас будет сохранено то самое, которое вам нужно. Примерный код, работающий как в C, так и в C++. Вводить слово-образец было лень и я его забил в массив -- для отладки и демонстрации примера достаточно и так.

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char *argv[]) {
    FILE *ifile;
    if (NULL == (ifile = fopen(argv[1], "r"))) {
        perror(argv[1]);
        exit(errno);
    }
    int n    = 0;
    int nmax = 0;
    char *ss;
    char smpl_word[] = "sample_word";
    char next_word[1024];
    char most_word[1024];
    // читаем файл словами
    while (1 == fscanf(ifile, "%1023s", next_word)) {
        // сканируем для каждой буквы полученного слова факт
        // вхождения в smpl_word
        ss = next_word;
        n  = 0;
        do { // scanf никогда не возвращает пустых строк
            if (strchr(smpl_word, *ss++)) {
                n++;    // и отмечаем если входит
            }
        } while (*ss);
        // проверка на превышение количеств вхождений
        if (n > nmax) {
            nmax = n;
            strcpy(most_word, next_word);
        }
    }
    // собственно, и все на этом
    fprintf(stdout, "%s\n", most_word);
    return 0;
    argc++;
}
Answer 4
#include <iostream>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;
int getRateWordByPattern(const string& word, const string& pattern)
{
    int rate = 0;
    for (int i = 0; i < pattern.size(); ++i)
        rate += std::count(word.begin(), word.end(), pattern[i]);
    return rate;
}
void main()
{
    string pattern = "ght";
    ifstream f;
    f.open("D://1.txt");
    if (!f.is_open())
        return;
    int max_rate = 0;
    string res_word = "not found";
    string word;
    while (f >> word)
    {
        int rate = getRateWordByPattern(word, pattern);
        if (rate > max_rate)
        {
            max_rate = rate;
            res_word = word;
        }
    }
    cout << max_rate << endl;
    cout << res_word << endl;
    char ch;
    cin >> ch;
}

Накидал тут на коленке. Нет обработки ошибок, данные все забил хардкорно. Слово с буквами для поиска в переменной pattern.

В файле у меня строка вида: one two three four five six seven eight nine ten.

Ввод данных, валидацию и обработку ошибок встроишь сам и все.

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

READ ALSO
Найти НОК для всех чисел из файла

Найти НОК для всех чисел из файла

Есть файл, в нём написаны числаНужно найти и вывести на экран самое маленькое число, которое делится на все числа из файла, тобишь наименьшее...

241
Медленный цикл с векторами в С++

Медленный цикл с векторами в С++

Здравствуйте , есть такой код :

221
Не удаётся открыть источник файла [требует правки]

Не удаётся открыть источник файла [требует правки]

Если открываю готовый проект - не работают стандартные библиотеки

311
Хранение объектов разных типов

Хранение объектов разных типов

Есть абстрактный класс "Organism"Его наследуют 2 классa: "Animals" и "Plants"

221