Методы C# для поиска самой длинной подстроки без повторяющихся символов

Чтобы найти самую длинную подстроку без повторяющихся символов в C#, вы можете использовать различные методы. Вот несколько подходов:

Метод 1: Техника скользящего окна
Техника скользящего окна предполагает сохранение окна символов и его перемещение по строке, отслеживая при этом самую длинную подстроку без повторяющихся символов.

public string LongestSubstringWithoutRepeatingCharacters(string s)
{
    int n = s.Length;
    HashSet<char> set = new HashSet<char>();
    int maxLength = 0, i = 0, j = 0;
    while (i < n && j < n)
    {
        if (!set.Contains(s[j]))
        {
            set.Add(s[j++]);
            maxLength = Math.Max(maxLength, j - i);
        }
        else
        {
            set.Remove(s[i++]);
        }
    }
    return s.Substring(i, maxLength);
}

Метод 2: метод грубой силы
При этом подходе вы проверяете каждую возможную подстроку на наличие повторяющихся символов и отслеживаете самую длинную подстроку без каких-либо повторений.

public string LongestSubstringWithoutRepeatingCharacters(string s)
{
    int n = s.Length;
    int maxLength = 0;
    string longestSubstring = "";
    for (int i = 0; i < n; i++)
    {
        HashSet<char> set = new HashSet<char>();
        set.Add(s[i]);
        string currentSubstring = s[i].ToString();
        for (int j = i + 1; j < n; j++)
        {
            if (set.Contains(s[j]))
                break;
            set.Add(s[j]);
            currentSubstring += s[j];
        }
        if (currentSubstring.Length > maxLength)
        {
            maxLength = currentSubstring.Length;
            longestSubstring = currentSubstring;
        }
    }
    return longestSubstring;
}

Метод 3: оптимизированный подход с использованием словаря.
Этот подход использует словарь для хранения индекса последнего вхождения каждого символа. Поддерживая два указателя, вы можете эффективно найти самую длинную подстроку без повторяющихся символов.

public string LongestSubstringWithoutRepeatingCharacters(string s)
{
    int n = s.Length;
    int maxLength = 0, start = 0;
    Dictionary<char, int> dict = new Dictionary<char, int>();
    for (int i = 0; i < n; i++)
    {
        if (dict.ContainsKey(s[i]))
        {
            start = Math.Max(start, dict[s[i]] + 1);
            dict[s[i]] = i;
        }
        else
        {
            dict.Add(s[i], i);
        }
        maxLength = Math.Max(maxLength, i - start + 1);
    }
    return s.Substring(start, maxLength);
}