Как разделить строку на слова игнорируя любые символы кроме букв?

86
30 июля 2019, 23:50

Вот есть задача https://leetcode.com/problems/valid-palindrome/

Я понимаю, что строку нужно сначала рассплитить, избавиться от всевозможных знаков, склеить в одну строку и эту строку сравнить со своим перевертышем.

Я понимаю, что вот так:

string s = "A man, a plan, a canal: Panama";
string[] array = s.Split(new char[] {' ', ':', ','});
foreach(var ch in array)
    Console.WriteLine(ch);

это неправильно, потому что я фактически захардкодил двоеточие, пробел и запятую. если мы введем любую другую строку с другими знаками - работать корректно не будет.

Предложите, пожалуйста, варианты решения.

Answer 1

Вариант без Linq и без лишних выделений памяти.

public bool IsPalindrome(string s)
{   
    for (int i = 0, j = s.Length - 1; i < j;)
    {
        var ci = s[i];
        var cj = s[j];
        if (char.IsLetterOrDigit(ci) && char.IsLetterOrDigit(cj))
        {
            var loweri = char.ToLower(ci);
            var lowerj = char.ToLower(cj);              
            if (loweri!=lowerj) return false;
            i++;
            j--;
            continue;
        }
        if (!char.IsLetterOrDigit(ci)) i++;
        if (!char.IsLetterOrDigit(cj)) j--;
    }
    return true;
}
Answer 2

LINQ вариант:

public bool IsPalindrome(string s)
{
    var resStr = s.Where(Char.IsLetterOrDigit).Select(Char.ToLower);
    return resStr.SequenceEqual(resStr.Reverse());
}
Answer 3

Нужно идти от обратного

В памяти, буквы английского алфавита расположены по порядку друг за другом (большие и маленькие отдельно), поэтому если наш символ подходит под описание буквы, то мы его выводим

class Program
{
    static void Main(string[] args)
    {
        string s = "A man, a plan, a canal: Panama";
        foreach (var ch in s)
        {
            if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
                Console.WriteLine(ch);
        }
        Console.ReadKey();
    }
}
READ ALSO
Реализовать один-к-одному Entity Framework

Реализовать один-к-одному Entity Framework

Есть 2 класса, хочу соединить связью один-к-одному

120
Ошибка CS0234 Тип &ldquo;Forms&rdquo; не существует в пространстве имен &ldquo;System.Windows&rdquo; (возможно, отсутствует ссылка на сборку)

Ошибка CS0234 Тип “Forms” не существует в пространстве имен “System.Windows” (возможно, отсутствует ссылка на сборку)

В общем, сама идея в чем- для практики хочу сделать игру 15(пятнашки) на с#На видео(Youtube) игра пишется под Windows Forms, но я ее потихоньку адаптирую...

109
Как добавить текст на фото без GD Library (или оптимизировать его), средствами PHP?

Как добавить текст на фото без GD Library (или оптимизировать его), средствами PHP?

Есть необходимость динамически генерировать текст на фото, фото может быть любого размера, текст при этом, должен быть в верхнем правом углуТекущий...

134
Получить значение массива

Получить значение массива

Переносила приложение на новый сервер и заметила такую штуку: при использовании конструкции такого вида

111