Войти

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


Frozen_Sky
25-05-2014, 20:33
Ребят, помогите пожалуйста, есть код, в строку вбивается слово. Нужно в строке найти группы слов, имеющие одинаковый состав букв (количество одинаковых букв не имеет значения), слова выводить в порядке их вхождения в строку. Ну например в строке идут слова: abba abaa abca ab abc, затем идет разделение по строкам, в первую строку идут abba abaa и ab, так как состав букв одинаковый, затем новая строчка: abca abc. Ну... как-то так, мне бы хотя бы узнать как поиск реализуется. Очень нужно, буду благодарен.
#include "stdafx.h"
#include <string.h>
#include <stdio.h>

void main()
{
char str[81]; // Исходная строка

gets(str);

char copy_str[81]; // копия строки, чтобы не портить исходную
strcpy(copy_str,str); // делаем копию

char *razdel=" \n\t\r\".,!?"; // Разделители слов (для разбивки)
char *word; // очередное слово строки

word=strtok(copy_str,razdel); // получаем первое слово

while(word)
{
printf("%s\n", word); // печатаем очередное слово
word=strtok(NULL,razdel); // далее (с текущего места в строке) - получаем следующее слово
}

getch();

}

pva
25-05-2014, 22:35
я всегда считал, что конкретная реализация на языке - дело вторичное. Главное - понимание того, что хочешь сделать и владение примитивами программирования (строки, стеки, вектора, словари...)
Скажи на пальцах как хочешь сделать - мы закодируем

User001
26-05-2014, 07:13
Ну... как-то так, мне бы хотя бы узнать как поиск реализуется. »На C писать долго будете. Самое простое делаете список, элементы которого списки слов. Далее разбираете ваши строки, ищете из каких букв состоят. Если в списке есть такая запись, то добавляете строку туда, если нет, то создаете элемент списка.
А вообще, если на C++, то с помощью того же map это вполне быстро пишется.

Frozen_Sky
26-05-2014, 17:18
pva, если бы я знал, как хочу сделать, а так увы. Все что знаю, что нам нельзя использовать stl функции, все писать самостоятельно руками, а я понятие не имею как. Возможно ли как то поиск сделать через массив?

User001, Далее разбираете ваши строки, ищете из каких букв состоят. Если в списке есть такая запись, то добавляете строку туда, если нет, то создаете элемент списка. »
кстати, вроде неплохой вариант, а можно хотя бы примерно глянуть как это выглядеть должно? P.S. пишу на С++

pva
26-05-2014, 21:20
Возможно ли как то поиск сделать через массив? »
И ещё как можно! Но наша цель не в том, чтобы обязательно использовать массив, а в том, чтобы научиться "придумывать" программы
Frozen_Sky, как бы вы это написали на C++?

User001
27-05-2014, 08:30
кстати, вроде неплохой вариант, а можно хотя бы примерно глянуть как это выглядеть должно? »Не знаю, зачем оно вам, не должно, а один из вариантов. Например, так:
#include <iostream>
#include <string>
#include <list>
#include <sstream>
#include <map>
#include <algorithm>

std::string get_letters(std::string word)
{
std::string letters;
for (size_t i = 0; i < word.length(); ++i)
if (letters.find(word[i], 0) == std::string::npos)
letters.push_back(word[i]);
std::sort(letters.begin(), letters.end());
return letters;
}

int main()
{
std::list<std::string> words;
std::string text = "abba abaa abca ab abc abd ddbba abcccba";
std::istringstream ist(text);
std::string buffer;
while (ist >> buffer)
words.push_back(buffer);
std::cout << "Number of words: " << words.size() << std::endl;

std::map<std::string, std::list<std::string> > table;
for (std::list<std::string>::iterator it = words.begin(); it != words.end(); ++it)
table[get_letters(*it)].push_back(*it);

for (std::map<std::string, std::list<std::string> >::iterator it = table.begin(); it != table.end(); ++it)
{
std::cout << it->first << ": ";
for (std::list<std::string>::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2)
std::cout << *it2 << ' ';
std::cout << std::endl;
}

return 0;
}

На академичности и чистоту кода не претендую, про auto слышал.
А вообще, pva прав, сейчас задача научиться "придумывать" программы ».




© OSzone.net 2001-2012