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

Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор - C++

Восстановить пароль Регистрация
 
Sergey_Chizhov
1 / 1 / 0
Регистрация: 21.09.2013
Сообщений: 30
27.01.2014, 10:21     Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор #1
Нужно разбить минимальную строку на "связные" подстроки

Например:
строка Mas[min_i]: "qwe"
нужны подстроки: "q","w","e","qw","we","qwe".
не нужны типа: "qe","weq" и т.д.

получившиеся подстроки нужно записать в вектор или массив(что удобнее)

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 "std_lib_facilities.h"
 
const int  MAX=10000;
 
int main()
{
    cout<<"Input kol-vo strok(1-10): ";
    int nrow;
    cin>>nrow;
    char** Mas = new char *[nrow];
    for (int i=0;i<nrow;i++) 
        Mas[i]=new char [MAX];
    cout<<"Input stroki:\n";
    int min_len=10000,
        min_i=0;
    for(int i=0; i<nrow; i++){
         cin>>Mas[i];
         if (strlen(Mas[i])<=min_len){
             min_len = strlen(Mas[i]);
             min_i=i;
         }
    }
    cout<<min_len<<endl;
 
        
    keep_window_open();
    return 0;
}
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2014, 10:21     Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор
Посмотрите здесь:

Мне надо сделать поиск последнего вхождения подстроки s1 в строку s(с функцией LastPos, не strstr). В этом коде просто вхождение подстроки в строку. C++
C++ Разбить строку string на подстроки
C++ Определить число вхождений в строку подстроки "аба", вывести символы строки, не являющейся буквами или цифрами
C++ Двумерные массивы. Можно ли, разбив строку на подстроки, записать их в строке двумерного массива N x N по одной цифре?
C++ нужно разбить исходную строку на две подстроки , причём первая длинной k
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
27.01.2014, 11:47     Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор #2
Sergey_Chizhov, имеете в виду так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
 
int main() {
    std::string str = "qwe";
 
    for (unsigned i = 0; i < str.length(); ++i) {
        for (unsigned j = 0; j < str.length() - i; ++j) {
            std::cout << std::string(str, j, i + 1) << " ";
        }
    }
 
    return 0;
}
Добавлено через 4 минуты
А если нужен ещё массив, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <vector>
 
int main() {
    std::string str = "qwe";
    std::vector<std::string> array;
 
    for (unsigned i = 0; i < str.length(); ++i) {
        for (unsigned j = 0; j < str.length() - i; ++j) {
            array.push_back(std::string(str, j, i + 1));
        }
    }
 
    for (unsigned i = 0; i < array.size(); ++i) {
        std::cout << array[i] << " ";
    }
 
    return 0;
}
Sergey_Chizhov
1 / 1 / 0
Регистрация: 21.09.2013
Сообщений: 30
27.01.2014, 17:20  [ТС]     Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор #3
anmartex, объясните пожалуйста, что делает строка: std::string(str, j, i + 1)?
И зачем здесь везде использовать доступ std:: ?
Очень благодарен)
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
27.01.2014, 17:39     Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор #4
Цитата Сообщение от Sergey_Chizhov Посмотреть сообщение
И зачем здесь везде использовать доступ std:: ?
Это пространство имён. Если режет глаз, то напишите в начале: using namespace std;.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <vector>
 
using namespace std;
 
int main() {
    string str = "qwe";
    vector<string> array;
 
    for (unsigned i = 0; i < str.length(); ++i) {
        for (unsigned j = 0; j < str.length() - i; ++j) {
            array.push_back(string(str, j, i + 1));
        }
    }
 
    for (unsigned i = 0; i < array.size(); ++i) {
        cout << array[i] << " ";
    }
 
    return 0;
}


Цитата Сообщение от Sergey_Chizhov Посмотреть сообщение
что делает строка: std::string(str, j, i + 1)?
Создаёт новую строку из str, начиная с позиции j, длиной i+1.
Sergey_Chizhov
1 / 1 / 0
Регистрация: 21.09.2013
Сообщений: 30
27.01.2014, 22:21  [ТС]     Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор #5
anmartex, спасибо!
и ещё вопросик.
Почему при следующем выполнении кода происходит out of range(не пойму где ошибка):
C++
1
2
3
4
5
    for (unsigned i = str.length()-1; i>=0 ; i--) {
        for (unsigned j = 0; j < str.length() - i; j++) {
            array.push_back(string(str, j, i+1));  //j-позиция    i-длина
        }
    }
Нужно чтобы в векторе значения были записаны по убыванию длины строки, т.е. наоборот.

Есть ли подобная стандартная сортировка?
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
28.01.2014, 03:43     Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор #6
Цитата Сообщение от Sergey_Chizhov Посмотреть сообщение
Почему при следующем выполнении кода происходит out of range(не пойму где ошибка):
Потому что переменная i - unsigned. Т.е. условие i>=0 всегда будет выполняться, ведь после 0 она примет значение UINT32_MAX (4294967295). И тут естественно будет out of range.

Выходом из ситуации будет: либо заменить unsigned на int, либо сыграть с +/- 1.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <vector>
 
int main() {
    std::string str = "qwe";
    std::vector<std::string> array;
 
    for (unsigned i = str.length(); i > 0; --i) {
        for (unsigned j = 0; j < str.length() - i + 1; ++j) {
            array.push_back(std::string(str, j, i));
        }
    }
 
    for (unsigned i = 0; i < array.size(); ++i) {
        std::cout << array[i] << " ";
    }
 
    return 0;
}
Yandex
Объявления
28.01.2014, 03:43     Разбить строку на все "связные" подстроки. Получившиеся подстроки записать в вектор
Ответ Создать тему
Опции темы

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