Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
дарт вейдер
5 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 92
#1

два слова А и В - C++

12.06.2013, 22:17. Просмотров 541. Ответов 17
Метки нет (Все метки)

составить алгоритм
даны два слова А и В. проверить можно ли с букв, входящих в слово А, составить слова В.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2013, 22:17     два слова А и В
Посмотрите здесь:
C++ Дано предложение, где два слова различны. Найти эти слова
C++ Дано предложение. В нем только два слова одинаковые. Найти эти слова
Ввести строку и два слова, заменить все вхождения первого слова на второе C++
Из заданного слова сформировать два новых слова C++
C++ Даны два слова, в каждом из которых от 1 до 8 строчных латинских букв и за каждым из которых - пробел. Напечатать слова в алфавитном порядке
C++ Даны два слова
C++ Даны два слова
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
1701 / 1194 / 495
Регистрация: 12.02.2013
Сообщений: 1,978
13.06.2013, 17:28     два слова А и В #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <map>
 
int main()
{
   std::cout << "input two words: ";
   std::string A, B;
   std::cin >> A >> B;
 
   std::map<char, int> chars;
 
   for (size_t i = 0; i < A.size(); ++i)
   {
      chars[A[i]]++;
   }
 
   for (size_t i = 0; i < B.size(); ++i)
   {
      chars[B[i]]--;
   }
 
   bool ok = true;
   std::map<char, int>::iterator it;
   for (it = chars.begin(); (it != chars.end()) && ok; ++it)
   {
      ok = (it->second >= 0);
   }
 
   std::cout << (ok ? "yes" : "no") << std::endl;
 
   return 0;
}
два слова А и В
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
13.06.2013, 17:42     два слова А и В #3
C++
1
2
3
4
5
6
7
8
9
int Check(char *s, char *t)
{
   int count[256] = {0}, i;
   for(; *s; ++s)
      ++count[*s];
   for(; *t && --count[*t] >= 0; ++t)
      ;
   return !(*t);
}
дарт вейдер
5 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 92
13.06.2013, 18:07  [ТС]     два слова А и В #4
спасибо, класно получилось,))))))
anmartex
...
1701 / 1194 / 495
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 03:48     два слова А и В #5
Thinker, в вашем алгоритме есть потенциальный баг. Т.к. char является знаковым, то в случае с использованием кириллицы ваш код будет не корректным и вызовет segmentation fault
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
14.06.2013, 08:58     два слова А и В #6
это понятно, ориентируюсь на латиницу.
anmartex
...
1701 / 1194 / 495
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 09:39     два слова А и В #7
Цитата Сообщение от Thinker Посмотреть сообщение
это понятно, ориентируюсь на латиницу.
Хотя тут скорее не segmentation fault, а undefined behavior
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
14.06.2013, 10:46     два слова А и В #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <algorithm>
 
bool check(std::string first, std::string two);
 
int main()
{
    std::cout << "Enter string: ";
 
    std::string first, two;
    std::cin >> first >> two;
 
    std::cout << (check(first, two) ? "True" : "False") << std::endl;
 
    return 0;
}
 
bool check(std::string first, std::string two)
{
    std::sort(first.begin(), first.end());
    std::sort(two.begin(), two.end());
 
    return first == two ? true : false;
}
Добавлено через 39 секунд
Также работает и для кириллицы.

Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <string>
#include <algorithm>
 
bool check(std::string first, std::string two);
 
int main()
{
    std::cout << "Enter string: ";
 
    std::string first, two;
    std::cin >> first >> two;
 
    std::cout << (check(first, two) ? "True" : "False") << std::endl;
 
    return 0;
}
 
bool check(std::string first, std::string two)
{
    std::sort(first.begin(), first.end());
    std::sort(two.begin(), two.end());
 
    if(two.length() < first.length())
        return false;
    else if(first == two)
        return true;
    else
        for(size_t i = 0; i < first.length(); ++i)
            if(first.at(i) != two.at(i))
                return false;
    
    return true;
}
Работает с разным кол-во букв.
anmartex
...
1701 / 1194 / 495
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 10:46     два слова А и В #9
GetVariable, да, но никто не говорит что наборы должны совпадать. Т.е. из слова hello можно составить слово lol.
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
14.06.2013, 10:49     два слова А и В #10
Цитата Сообщение от anmartex Посмотреть сообщение
GetVariable, да, но никто не говорит что наборы должны совпадать. Т.е. из слова hallo можно составить слово all.
Действительно, секундочку.
anmartex
...
1701 / 1194 / 495
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 10:51     два слова А и В #11
Работает с разным кол-во букв.
Нет
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
14.06.2013, 11:12     два слова А и В #12
сейчас.

Добавлено через 17 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>
#include <algorithm>
 
bool check(std::string first, std::string two);
 
int main()
{
    std::cout << "Enter string: ";
 
    std::string first, two;
    std::cin >> first >> two;
 
    std::cout << (check(first, two) ? "True" : "False") << std::endl;
 
    return 0;
}
 
bool check(std::string first, std::string two)
{
    for(size_t i = 0; i < first.length(); ++i)
        if(two.find(first.at(i)) == std::string::npos)
            return false;
    else
        two[i] = '0'; //black magic.
 
    return true;
}
anmartex
...
1701 / 1194 / 495
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 11:22     два слова А и В #13
Опять мимо
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
14.06.2013, 11:29     два слова А и В #14
http://codepad.org/9NQYm5I0
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>
#include <algorithm>
 
bool check(std::string first, std::string two);
 
int main()
{
    std::cout << "Enter string: ";
 
    std::string first, two;
    std::cin >> first >> two;
 
    std::cout << (check(first, two) ? "True" : "False") << std::endl;
 
    return 0;
}
 
bool check(std::string first, std::string two)
{
    for(size_t i = 0; i < two.length(); ++i)
        if(first.find(two.at(i)) == std::string::npos)
            return false;
    else
        first[i] = '0'; //black magic.
 
    return true;
}
anmartex
...
1701 / 1194 / 495
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 11:40     два слова А и В #15
Снова мимо
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
14.06.2013, 11:47     два слова А и В #16
=
Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <string>
 
bool check(std::string first, std::string two);
 
int main()
{
    std::cout << "Enter string: ";
 
    std::string first, two;
    std::cin >> first >> two;
 
    std::cout << (check(first, two) ? "True" : "False") << std::endl;
 
    return 0;
}
 
bool check(std::string first, std::string two)
{
    for(size_t i = 0; i < two.length(); ++i)
        if(first.find(two.at(i)) == std::string::npos)
            return false;
    else
        first[first.find(two.at(i))] = '0'; //black magic.
 
    return true;
}
Добавлено через 1 минуту
http://codepad.org/EINW5GC0
anmartex
...
1701 / 1194 / 495
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 11:51     два слова А и В #17
GetVariable, а не расточительно ли два раза поиск делать за одну итерацию?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 11:54     два слова А и В
Еще ссылки по теме:
C++ Переставить два слова местами
C++ Как соединить два слова
Как сравнить два слова C++
C++ Сравнить два введённых слова
Проверить, совпадают ли два введённых слова C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
14.06.2013, 11:54     два слова А и В #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool check(std::string first, std::string two)
{
    size_t found;
 
    for(size_t i = 0; i < two.length(); ++i)
    {
        found = first.find(two.at(i));
 
        if(found == std::string::npos)
            return false;
        else
            first[found] = '0'; //black magic.
    }
    return true;
}
Yandex
Объявления
14.06.2013, 11:54     два слова А и В
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru