поиск подстрок в массиве, состоящих из одинаковых букв

244
04 января 2019, 04:10

предположим, у меня есть массив строк

{"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++;
         }
      }
   }
}

как избавиться от проверки подстроки с самой собой и как составить эти пары?

Answer 1

Для того, чтобы не сверять элемент с собой же, используйте такие циклы:

  for (int i = 0; i < 3; i++)
  {
      for (int j = i + 1; j < 4; j++)
     {

(в данном случае этого может и не понадобиться)

Если сортированные строки (из "vhag" сделать "aghv") совпадают, то исходные являются анаграммами

Поэтому можно: отсортировать символы в строках, составив структуры {сортированная; исходная}

Отсортировать массив структур по ключу сортированных строк

Пройтись по результату одним циклом, сравнивая только соседние структуры на равенство ключа

Как вариант - добавлять структуры в map, проверяя на наличие такого же ключа.

Answer 2

Что-то ваш вопрос очень похож на тестовое задание или лабораторку по информатике.

Ну вот например вот так можно отсортировать и сгруппировать в плюсах:

(тест) 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);
}
READ ALSO
Запись и чтение в файл с использованием fstream

Запись и чтение в файл с использованием fstream

Нужно периодически писать в файл данные, и из другого потока считывать и обрабатывать

229
В чем ошибается мой алгоритм (частотный анализ)?

В чем ошибается мой алгоритм (частотный анализ)?

Сразу говорю, что мой алгоритм не претендует на лучшее решение, я просто не могу понять, почему он правильно узнает только пробел (в 100% случаев),...

209
Добавление в ArrayList Color

Добавление в ArrayList Color

Немного изменила

178
Игра в угадывание(Head First Java)

Игра в угадывание(Head First Java)

Новичок начал изучать Head First Java столкнулся с проблемой что код используемый в этой книге устарел, помогите довести задачу до рабочего состояния)

192