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

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

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

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

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

составить алгоритм
даны два слова А и В. проверить можно ли с букв, входящих в слово А, составить слова В.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 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++
 Аватар для Thinker
4218 / 2192 / 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
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 03:48     два слова А и В #5
Thinker, в вашем алгоритме есть потенциальный баг. Т.к. char является знаковым, то в случае с использованием кириллицы ваш код будет не корректным и вызовет segmentation fault
Thinker
Эксперт C++
 Аватар для Thinker
4218 / 2192 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
14.06.2013, 08:58     два слова А и В #6
это понятно, ориентируюсь на латиницу.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 09:39     два слова А и В #7
Цитата Сообщение от Thinker Посмотреть сообщение
это понятно, ориентируюсь на латиницу.
Хотя тут скорее не segmentation fault, а undefined behavior
GetVariable
 Аватар для 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
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 10:46     два слова А и В #9
GetVariable, да, но никто не говорит что наборы должны совпадать. Т.е. из слова hello можно составить слово lol.
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
14.06.2013, 10:49     два слова А и В #10
Цитата Сообщение от anmartex Посмотреть сообщение
GetVariable, да, но никто не говорит что наборы должны совпадать. Т.е. из слова hallo можно составить слово all.
Действительно, секундочку.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 10:51     два слова А и В #11
Работает с разным кол-во букв.
Нет
GetVariable
 Аватар для 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
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 11:22     два слова А и В #13
Опять мимо
GetVariable
 Аватар для 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
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
14.06.2013, 11:40     два слова А и В #15
Снова мимо
GetVariable
 Аватар для 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
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 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
 Аватар для 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     два слова А и В
Ответ Создать тему
Опции темы

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