Kategoria: C# Dodane przez marcin90

Czy podany string jest palindromem?

Palindrom to wyrażenie brzmiące tak samo czytane od lewej do prawej jak i od prawej do lewej. Przykłady:
  • Ala
  • Kobyła ma mały bok
  • Atak kata
  • Może jutro ta dama da tortu jeżom
Napisz metodę, która jako parametr przyjmuje wyrażenie typu string i zwraca wartość typu true jeżeli wyrażenie jest palindromem. Jeśli wyrażenie nie jest palindromem metoda powinna zwrócić false. Pisząc kod miej na uwadze dobre praktyki oraz ewentualne problemy wydajnościowe w przypadku długich wyrażeń.

2 odpowiedzi

0 0 Dodane 10-06-2018 przez marcin90

Przykładowe rozwiązanie

public static bool IsPalindrom(string wordToCheck)
{
  if (String.IsNullOrEmpty(wordToCheck))
    return false;
  wordToCheck = wordToCheck
                .Replace(" ", "")
                .ToLower();

  int length = wordToCheck.Length;

  for (int i = 0; i < length / 2; i++)
  {
    if (wordToCheck[i] != wordToCheck[length - i - 1])
      return false;
  }
  return true;
}

Wyjaśnienie

Na początku sprawdzamy czy nie został przekazany pusty ciąg znaków bądź wartość null. Jeżeli tak to zwracamy false.
 if (String.IsNullOrEmpty(wordToCheck))
    return false;

Następnie musimy wykonać czynności:

  • usuwamy spacje z otrzymanego wyrażenia
  • zamieniamy duże litery na małe
wordToCheck = wordToCheck
              .Replace(" ", "")
              .ToLower();

Proces sprawdzania jest następujący:
sprawdzamy pierwszą oraz ostatnią literę wyrażenia, jeżeli są różne to od razu zwracamy false. Następnie porównujemy drugą i przedostatnią literę itd. Gdy dojdziemy do połowy nie ma sensu porównywać dalej ponieważ litery te zostały już sprawdzone. Jeśli pierwsz połowa wyrażnia równa sie drugiej połowie wyrażenia zwracamy true.


0 0 Dodane 28-07-2018 przez Maranta (gość)

Pytanie czy dla rozwiązania poniżej korzystanie z funkcji wbudowanych jest dobrą praktyką?

        static bool Palindrom(string wordToCheck)
        {
            if (String.IsNullOrEmpty(wordToCheck))
                return false;
            else
                return wordToCheck.Replace(" ", "").ToLower().StartsWith(new string(wordToCheck.Replace(" ", "").ToLower().Substring(wordToCheck.Length / 2).Reverse().ToArray()));
        }

Dodaj swoją wersję odpowiedzi

Dodajesz odpowiedź jako gość. Zaloguj się się by uzyskać dostęp do rankingu oraz powiadomień.