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

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.

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()));
        }
januszgorszyciel 08-11-2018 11:52
Nie wiem jaka byłaby różnica w szybkości tego rozwiązania w stosunku do wcześniej zaproponowanego przez @marcin90 ale taka odpowiedź jak najbardziej powinna być uznana. Doczepiłbym się jednak baaaardzo mocno do upychania wszystkiego w jednej linijce na siłę i przez to duplikowania wyrażenia wordToCheck.Replace(" ", "").ToLower() :)

januszgorszyciel 08-11-2018 11:53
No i jeszcze to co @marcin90 dobrze zrobił, a u Ciebie niestety zabrakło - to nazwa metody nie sugeruje tego co robi

Zaloguj się lub zarejestruj by dodać odpowiedź.


© 2019 - SkillsTest.pl | | Regulamin | Polityka Prywatnosci