предположим, у меня есть массив строк
{"abcv","ghav","bvac","vhag"}
мне нужно найти подстроки, которые состоят из одинаковых букв и сформировать из них пары
{"abcv","bvac"}
{"ghav","vhag"}
у меня никак не получается это сделать
#include <iostream>
#include <cstring>
int main()
{
char String_Array[][11] = { "abcv","ghav","bvac","vhag" };
char Result_Array[1][11];
int k = 0;
for (int i = 1; i < 4; i++)
{
for (int index_i = 0; index_i < 4; index_i++)
{
int j = 0;
int specCnt = 0;
while (String_Array[i][j] != '\0')
{
int index_j = 0;
bool trigger = false;
while (String_Array[index_i][index_j] != '\0')
{
if (String_Array[index_i][index_j] == String_Array[i][j])
{
trigger = true;
break;
}
index_j++;
}
if (specCnt >= 0)
if (trigger)
specCnt++;
if (specCnt == strlen(String_Array[i]) && trigger)
{
strcpy_s(Result_Array[k], String_Array[i]);
k++;
}
j++;
}
}
}
}
как избавиться от проверки подстроки с самой собой и как составить эти пары?
Для того, чтобы не сверять элемент с собой же, используйте такие циклы:
for (int i = 0; i < 3; i++)
{
for (int j = i + 1; j < 4; j++)
{
(в данном случае этого может и не понадобиться)
Если сортированные строки (из "vhag" сделать "aghv") совпадают, то исходные являются анаграммами
Поэтому можно: отсортировать символы в строках, составив структуры {сортированная; исходная}
Отсортировать массив структур по ключу сортированных строк
Пройтись по результату одним циклом, сравнивая только соседние структуры на равенство ключа
Как вариант - добавлять структуры в map, проверяя на наличие такого же ключа.
Что-то ваш вопрос очень похож на тестовое задание или лабораторку по информатике.
Ну вот например вот так можно отсортировать и сгруппировать в плюсах:
(тест) https://www.onlinegdb.com/r1psIgROX
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
string asort(string input) {
sort(input.begin(), input.end());
return input;
}
int main() {
vector<string> strings = {"abcv","ghav","bvac","vhag"};
map<string,vector<string>> results;
results[asort(strings.at(0))].push_back(strings.at(0));
for (int i=1; i<strings.size(); i++) {
results[asort(strings.at(i))].push_back(strings.at(i));
}
for (auto it = results.begin(); it != results.end(); ++it ) {
for(vector<string>::const_iterator str = it->second.begin(); str != it->second.end(); ++str) {
cout << "" << *str << " ";
}
cout << endl;
}
return 0;
}
Баги есть всегда и везде (исправления):
vector<string> strings = {"abcv","ghav","bvac","vhag"};
map<string,vector<string>> results;
for (auto string = strings.begin(); string != strings.end(); ++string) {
results[asort(*string)].push_back(*string);
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей