• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Строки C#

  • Автор темы Dimka197
  • Дата начала
D

Dimka197

Проблема с кодом. Помогите, пожалуйста, решить проблему.
Задание:
Словом в строке считается последовательность букв латинского алфавита, остальные символы – разделители между словами. За один просмотр символов строки найти все самые длинные слова, состоящие только из различных букв, и занести их в новую строку, разделяя пробелом. Считать, что прописные и строчные буквы в словах не различаются.

Код:
C++:
using System;
using System.Collections.Generic;
using System.Text;

namespace task3
{
class Program
{
static void Main(string[] args)
{
string temp;
int i = 0;
string temp2="";
Console.WriteLine("Введите строку:");
temp = Console.ReadLine();
Console.WriteLine("Вы ввели: " + temp);
for (i = 0; i < temp.Length; i++)
{
if (temp[i] >= 'A' && temp[i] <= 'Z' || temp[i] >= 'a' && temp[i] <= 'z')
temp2 += temp[i];
else
{
if (temp[i - 1] >= 'A' && temp[i - 1] <= 'Z' || temp[i - 1] >= 'a' && temp[i - 1] <= 'z')
temp2 += " ";
else continue;
}
}
Console.WriteLine("Рабочая строка:");
Console.WriteLine(temp2);
string[] lines = new string[] //тестовый набор строк
foreach (var line in lines)
{
string result = "";
string temp = "";
int maxLength = 0;

for (int i = 0; i < line.Length; i++)
{
if (char.IsLetter(line, i))
{
temp += line[i];
}
else
{
if (temp.Length == maxLength && AllCharsDifferent(temp))
{
result += temp + " ";
maxLength = temp.Length;
}
else if (temp.Length > maxLength && AllCharsDifferent(temp))
{
result = temp + " ";
maxLength = temp.Length;
}

temp = "";
}
}
Console.WriteLine(result);

}
}
private static bool AllCharsDifferent(string p)
{
for (int i = 0; i < p.Length; i++)
for (int j = i; j < p.Length; j++)
if (i != j && p[i] == p[j])
return false;
return true;
}
}
}
 
0

0rtega

Я что-то не вижу, где в массив строк lines что-то кладется...кажись он пустой у вас.

А вообще вроде код нарушает задание. В задании написано за один проход все сделать, а у вас по сути проходов два
 
D

Dimka197

Я что-то не вижу, где в массив строк lines что-то кладется...кажись он пустой у вас.

А вообще вроде код нарушает задание. В задании написано за один проход все сделать, а у вас по сути проходов два
А как исправить ошибку?
 
B

BoYar

я бы сделал это задание так:
заводим словарь букв (ключ - строчная буква, значение - сколько раз встретилась в слове)
заводим словарь слов(ключ - длина слова, значение - слова данной длины)
заводим счётчик длины слова
заводим темповое слово
В цикле идём по строке:

если символ - латинская буква, проверяем сколько раз она встретилась в словаре букв (предварительно сделав ToLower())
если 0 раз:​
счётчик++, счётчик буквы++, темповое слово += буква​
если 1 раз:​
обнуляем счётчики букв, счётчик, темповое слово, прогоняем до ближайшего разделителя​
иначе
если темповое слово не пустое - заносим его в словарь слов​
иначе переходим к следующему символу.​

После того как строка окончилась в словаре строк выбираем наибольший ключ и выводим все строки из его значения (а если словарь будет типо SortedList, то просто берём последний ключ)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!