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

В качестве примера у меня есть случайная строка (я полагаю, регистр букв не имеет значения): "aqaswasldkaslfaslyetdop". Мне нужно создать метод, который принимает строку в качестве аргумента, затем создает новую строку с отдельными символами только из входной строки и возвращает длину самой длинной подстроки, состоящей из символов, которые, кроме того, появляются во входной строке более одного раза. вышеупомянутая новая строка: «aqaswasldkaslfaslyetdop» —> «qwkfaslyetdop»

int resultLength = GetMaxLengthOfDuplicateSubstring("aqaswasldkaslfaslyetdop", out string resultString);

Console.WriteLine($"{resultString}\nTHE LENGTH OF THE LONGEST DELETED SUBSTRING: {resultLength}");

// OUTPUT:
//
// qwkfaslyetdop
// THE LENGTH OF THE LONGEST DELETED SUBSTRING: 4

Я попытался найти набор повторяющихся символов.

var example = "qwasldkfaslyetdop";

var matchStrings = new string[example.Length];

var distinctStrings = new List<string>();

for (int index = 0; index < example.Length; index = index + 1)
{
    matchStrings[index] = example[index].ToString();

    if (Regex.Matches(example, matchStrings[index]).Count > 1)
    {
        distinctStrings.Add(matchStrings[index]);
    }
}

distinctStrings = distinctStrings.Distinct().ToList();

foreach (string element in distinctStrings)
{
    Console.WriteLine(element);
}

Но из-за всех этих перестановок, таких как "a", "s", "l", "d", "as", "sa", "asl", "sal", "sla", "lsa", "als", "las", "asld", ... я просто потерял первоначальную идею, как решить эту проблему. Я не знаю, почему преподаватель из частной онлайн-школы сделал такое сложное упражнение, я уже с ним сбился. Я пробовал также позитивный просмотр вперед/назад, но без особого успеха.

Я не знаю c#, но возможно: 1a) создать в строке набор повторяющихся символов. 1b) удалите все символы из этого набора из вашей строки. 2a) создайте список из 1 и 0 длины исходной строки; 1, если буква в наборе, 0 иначе. 2b) затем запустите накопительную сумму, которая сбрасывается до 0, когда происходит 0 (00110100111) -> (00120100123). 2c) найдите максимум из этого списка.

DuesserBaest 14.08.2024 09:26

Есть ли какие-либо ограничения на тип символов в вашей строке? Пунктуация, пробелы, неанглийские буквы....?

trincot 14.08.2024 09:35

Вы отметили это regex. Означает ли это, что эту проблему следует решить с помощью регулярных выражений? Вы получили эту инструкцию?

trincot 14.08.2024 09:38

Почему в вашем примере это не «aqaswasldkaslfaslyetdop» или «aqaswasldkaslfaslyetdop»? Я не понимаю, почему здесь «аслд» особенный.

canton7 14.08.2024 09:38

Почему вам нужно использовать регулярное выражение?

shingo 14.08.2024 09:38

@canton7 a,s,l,d появляются более одного раза.

shingo 14.08.2024 09:40

@shingo Если это просто удаление повторяющихся символов, почему это не «aqaswasldkaslfaslyetdop»?

canton7 14.08.2024 09:42

@canton7 Canton7 Я думаю, это следует понимать как удаление излишне повторяющихся символов. Например, что делает Distinct.

shingo 14.08.2024 09:51

@shingo Да, именно поэтому я и спрашиваю — гадать, что означает вопрос, никогда не будет хорошим решением!

canton7 14.08.2024 10:30

@DuesserBaest — не будет работать, мы просто считаем появление дублирующихся символов в строке в целом, но нам нужна подстрока там, где они расположены рядом, насколько я понимаю ваш алгоритм, мистер Баест, но у меня есть кое-что на уме, получилось Когда я последний час был на улице со своими индейками, это ужасно неэффективно с точки зрения вычислений, но я попробую реализовать.

Yaroslav Parkhomenko 14.08.2024 11:06

@trincot К сожалению, учительница ничего не пояснила о том, какие символы могут быть в тексте задачи, как и о перестановках, поэтому я упрощаю себе задачу, предполагая, что это только буквы...

Yaroslav Parkhomenko 14.08.2024 11:09

@trincot Потому что я пытался решить проблему с классом Regex, но пока не удалось. Это потому, что существует тег «регулярное выражение». Я ошибался?

Yaroslav Parkhomenko 14.08.2024 11:10

@shingo — Это не так просто. Мы можем удалить дубликаты с помощью Distinct(), он фактически использовался в приведенном выше примере, но как тогда мы можем посчитать длину соответствующей подстроки? Сначала мы должны сопоставить эту подстроку... И это для меня большая проблема из-за перестановок.

Yaroslav Parkhomenko 14.08.2024 11:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
13
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Объяснение:

1a) создайте набор повторяющихся символов в строке.

1b) удалите все символы из этого набора из вашей строки.

2a) создайте список из 1 и 0 длины исходной строки; 1, если буква в наборе, 0 иначе.

2b) затем запустите накопительную сумму, которая сбрасывается до 0, когда происходит 0 (00110100111) -> (00120100123).

2c) найдите максимум из этого списка.

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static Dictionary<char, int> ListToCountDict(List<char> l)
    {
        Dictionary<char, int> counts = new Dictionary<char, int>();
        foreach (char item in l)
        {
            if (counts.ContainsKey(item))
            {
                counts[item]++;
            }
            else
            {
                counts[item] = 1;
            }
        }
        return counts;
    }

    static void Main()
    {
        string str = "aqaswasldkaslfaslyetdop";

        var duplLetters = new HashSet<char>(ListToCountDict(str.ToList()).Where(kvp => kvp.Value > 1).Select(kvp => kvp.Key));

        string resS = new string(str.Where(s => !duplLetters.Contains(s)).ToArray());

        List<int> binaryDup = str.Select(s => duplLetters.Contains(s) ? 1 : 0).ToList();

        int max = 0;
        int cur = 0;
        foreach (int b in binaryDup)
        {
            if (b == 0)
            {
                cur = 0;
            }
            else
            {
                cur += b;
            }
            if (cur > max)
            {
                max = cur;
            }
        }

        Console.WriteLine($"Result String: {resS}, Max: {max}");
    }
}

Принты: Result String: qwkfyetop, Max: 4

да, пробовал в programiz

DuesserBaest 14.08.2024 09:46

Неправильный ответ, потому что если у нас есть «JKLOJMK», мы должны получить «LOJMK», а не «LOM». В любом случае спасибо за попытку... Я постараюсь прочитать ваш ответ и, возможно, я там смогу что-то полезное.

Yaroslav Parkhomenko 14.08.2024 11:00
abcdxabcxacxa вернет 9 для максимальной длины удаленной подстроки, что кажется неверным.
Matthew Watson 14.08.2024 11:02

@ЯрославПархоменко, пожалуйста, уточните свой вопрос! В «JKLOJMK» дубликаты — «JK», поэтому я ожидаю в результате «LOM».

DuesserBaest 14.08.2024 11:02

Да, согласен, вопрос не ясен. Я также ожидал бы LOM в результате того, как написан вопрос.

Matthew Watson 14.08.2024 11:03

@MatthewWatson, почему? Насколько я понимаю, все дубликаты должны быть удалены - сохраняется только d. тогда длинная последовательность равна 9: xabcxacxa

DuesserBaest 14.08.2024 11:04

@DuesserBaest — в примере внутри сообщения с вопросом довольно ясно: «aqaswasldkaslfaslyetdop» -> «qwkfaslyetdop» должно быть таким.

Yaroslav Parkhomenko 14.08.2024 11:16

@ЯрославПархоменко Это очень НЕ понятно - вот почему в этом столько путаницы!

canton7 14.08.2024 11:17

@ЯрославПархоменко, пожалуйста, отредактируйте свой вопрос, чтобы ПРОЯСНИТЬ, ПОЧЕМУ «aqaswasldkaslfaslyetdop» -> «qwkfaslyetdop». Я не получаю это сопоставление на основе вашего текущего объяснения.

DuesserBaest 14.08.2024 11:18

@DuesserBaest — «Вся созданная из них подстрока» должна быть удалена, как я указал в вопросе. «Они» означают дубликаты, и чтобы прояснить это, я привел пример. Я думал этого достаточно, но из-за моего плохого английского...

Yaroslav Parkhomenko 14.08.2024 11:19

@ЯрославПархоменко "qwkfaslyetdop", например, основан на более раннем "aqaswasldkaslfaslyetdop". так как же это может быть решением? или что мне не хватает?

DuesserBaest 14.08.2024 11:20

@DuesserBaest Вы правы, я неправильно понял вопрос.

Matthew Watson 14.08.2024 11:21

@DuesserBaest «qwkfaslyetdop» — может быть решением для «aqaswasldkaslfaslyetdop», поскольку мы создали новую строку с разными символами, жирный шрифт используется для символов, которые встречаются в исходной строке более одного раза.

Yaroslav Parkhomenko 14.08.2024 11:29

@ЯрославПархоменко Теперь я понимаю, что ты ищешь. Если хотите, я могу оставить вам этот ответ, иначе я удалю его, так как он не решает вашу проблему.

DuesserBaest 14.08.2024 11:34

@DuesserBaest Не удаляйте, пожалуйста, мне нужно сначала прочитать и понять.

Yaroslav Parkhomenko 14.08.2024 11:35

@DuesserBaest Я считаю, что идея с собирательной суммой очень гениальна! По крайней мере пока я так думаю... Так что попробую воспользоваться. Но я никогда не работал с собирательными суммами, поэтому не понимаю, как они вычисляются, я имею в виду для всего списка? Или для близлежащих элементов?

Yaroslav Parkhomenko 14.08.2024 11:49

@ЯрославПархоменко, ты перемещаешься по списку. когда вы встречаете 0, вы сбрасываете текущий счетчик. когда вы встречаете 1, вы добавляете 1 к текущему счетчику и проверяете, превышает ли он предыдущий максимум.

DuesserBaest 14.08.2024 12:12

@DuesserBaest Слишком плохо, я не могу выбрать два ответа как правильные. Но я воспользуюсь собирательной суммой и некоторой логикой из решения Mr. canton7, чтобы закончить этот ПРОКЛЯТЫЙ ТЕСТ! Спасибо.

Yaroslav Parkhomenko 14.08.2024 12:34

не беспокойся. не забудьте также проголосовать за ответ @canton7

DuesserBaest 14.08.2024 12:45
Ответ принят как подходящий

Что-то вроде этого?

int GetMaxLengthOfDuplicateSubstring(string input, out string result)
{
    var seen = new HashSet<char>();
    
    int maxRemoveLength = 0;
    int currentRemoveLength = 0;
    var resultBuilder = new List<char>();
    foreach (char c in input.Reverse())
    {
        if (seen.Add(c))
        {
            currentRemoveLength = 0;
            resultBuilder.Add(c);
        }
        else
        {
            currentRemoveLength++;
            maxRemoveLength = Math.Max(maxRemoveLength, currentRemoveLength);
        }
    }
    
    result = string.Concat(resultBuilder.AsEnumerable().Reverse());
    return maxRemoveLength;
}

Мы просматриваем строку задом наперед, записывая каждый символ, который мы видели. Если мы достигаем символа, который мы видели раньше, мы удаляем его из результата и ведем текущий подсчет количества символов, которые мы удалили в этой непрерывной последовательности.

Бегайте онлайн.

А как посчитать длину самой длинной подстроки, составленной из повторяющихся символов, стоящих вместе? Как в примере выше.

Yaroslav Parkhomenko 14.08.2024 11:33

Мы делаем это, как показано в моем коде, с currentRemoveLength для отслеживания длины текущей удаляемой подстроки и maxRemoveLength для отслеживания максимальной длины таких подстрок. Вы увидите, что он возвращает правильное значение, если щелкнете ссылку внизу моего ответа.

canton7 14.08.2024 11:34

В вашем алгоритме, господин Кантон, мы считаем длину подстроки, составленной из удаленных символов, насколько я понимаю, а это не так. Нам нужна длина подстроки, состоящей из таких символов, например 'ALSAOLXAOPL' —> 'SXAOPL', LENGTH: 3 Или я что-то упустил... О_о

Yaroslav Parkhomenko 14.08.2024 11:40

Ввод «ALSAOLXAOPL» возвращает 3. Используйте ссылку в моем вопросе, чтобы запустить код в Интернете, а затем замените «aqaswasldkaslfaslyetdop» на «ALSAOLXAOPL» в первой строке. На правой панели вы можете видеть, что код возвращает 3.

canton7 14.08.2024 11:45

@ЯрославПархоменко Ты следишь? Это совокупный подсчет, аналогичный ответу ДюссертБерта, но логика удаления повторяющихся символов значительно проще.

canton7 14.08.2024 12:21

— Я начинаю понимать! Спасибо и вам, мистер Кантон!

Yaroslav Parkhomenko 14.08.2024 12:35

Другие вопросы по теме