Чтобы найти самую длинную подстроку без повторяющихся символов в 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);
}