Jak sprawdzić, czy dany ciąg jest palindrom?

głosy
55

Definicja:

Palindrom to słowo, fraza, numer lub inny ciąg jednostek, które ma właściwość czytając takie same w obu kierunkach

Jak sprawdzić, czy dany ciąg jest palindrom?

Był to jeden z Faiq [Najczęściej zadawane pytanie wywiad] jakiś czas temu, ale to głównie za pomocą C.

Szuka rozwiązań w każdym i wszystkich możliwych językach.

Utwórz 09/09/2008 o 15:24
źródło użytkownik
W innych językach...                            


69 odpowiedzi

głosy
46

PHP próbka :

$string = "A man, a plan, a canal, Panama";

function is_palindrome($string)
{
    $a = strtolower(preg_replace("/[^A-Za-z0-9]/","",$string));
    return $a==strrev($a);
}

Usuwa wszystkie znaki inne niż alfanumeryczne (spacje, przecinki, wykrzykniki, itp), aby umożliwić pełnymi zdaniami jak wyżej, jak również proste słowa.

Odpowiedział 09/09/2008 o 15:42
źródło użytkownik

głosy
34

Windows XP (może też działać na 2000) lub nowszym skrypt SERII:

@echo off

call :is_palindrome %1
if %ERRORLEVEL% == 0 (
    echo %1 is a palindrome
) else (
    echo %1 is NOT a palindrome
)
exit /B 0

:is_palindrome
    set word=%~1
    set reverse=
    call :reverse_chars "%word%"
    set return=1
    if "$%word%" == "$%reverse%" (
        set return=0
    )
exit /B %return%

:reverse_chars
    set chars=%~1
    set reverse=%chars:~0,1%%reverse%
    set chars=%chars:~1%
    if "$%chars%" == "$" (
        exit /B 0
    ) else (
        call :reverse_chars "%chars%"
    )
exit /B 0
Odpowiedział 09/09/2008 o 15:36
źródło użytkownik

głosy
29

Język agnostyk meta-code potem ...

rev = StringReverse(originalString)
return ( rev == originalString );
Odpowiedział 09/09/2008 o 15:29
źródło użytkownik

głosy
24

C # algorytm na miejscu. Wszelkie przerób, jak przypadek niewrażliwość lub odpędzania spacji i interpunkcji należy zrobić przed przejściem do tej funkcji.

boolean IsPalindrome(string s) {
    for (int i = 0; i < s.Length / 2; i++)
    {
        if (s[i] != s[s.Length - 1 - i]) return false;
    }
    return true;
}

Edit: usuwa zbędne „ +1” w warunku pętli i spędził zapisany porównanie na usunięcie nadmiarowej porównanie długości. Dzięki komentujących!

Odpowiedział 09/09/2008 o 15:38
źródło użytkownik

głosy
15

C #: LINQ

var str = "a b a";
var test = Enumerable.SequenceEqual(str.ToCharArray(), 
           str.ToCharArray().Reverse());
Odpowiedział 09/09/2008 o 15:37
źródło użytkownik

głosy
14

Bardziej Ruby stylu przepisanie wersji Ruby Hala :

class String
  def palindrome?
    (test = gsub(/[^A-Za-z]/, '').downcase) == test.reverse
  end
end

Teraz możesz dzwonić palindrome?na dowolny ciąg.

Odpowiedział 09/09/2008 o 20:52
źródło użytkownik

głosy
11

Rozwiązanie Java:

public class QuickTest {

public static void main(String[] args) {
    check("AmanaplanacanalPanama".toLowerCase());
    check("Hello World".toLowerCase());
}

public static void check(String aString) {
    System.out.print(aString + ": ");
    char[] chars = aString.toCharArray();
    for (int i = 0, j = (chars.length - 1); i < (chars.length / 2); i++, j--) {
        if (chars[i] != chars[j]) {
            System.out.println("Not a palindrome!");
            return;
        }
    }
    System.out.println("Found a palindrome!");
}

}

Odpowiedział 09/09/2008 o 15:41
źródło użytkownik

głosy
11

Unoptimized Python:

>>> def is_palindrome(s):
...     return s == s[::-1]
Odpowiedział 09/09/2008 o 15:34
źródło użytkownik

głosy
10

C w domu. (Nie wiem, jeśli nie chce Przykład C tutaj)

bool IsPalindrome(char *s)
{
    int  i,d;
    int  length = strlen(s);
    char cf, cb;

    for(i=0, d=length-1 ; i < length && d >= 0 ; i++ , d--)
    {
        while(cf= toupper(s[i]), (cf < 'A' || cf >'Z') && i < length-1)i++;
        while(cb= toupper(s[d]), (cb < 'A' || cb >'Z') && d > 0       )d--;
        if(cf != cb && cf >= 'A' && cf <= 'Z' && cb >= 'A' && cb <='Z')
            return false;
    }
    return true;
}

Że zwróci true dla "wyścigowy", "wyścigowy", "wyścigowy", "wyścigowy" i "Race Car". Byłoby łatwo zmodyfikować, aby zawierać symbole lub przestrzeni, jak również, ale ja figura to bardziej przydatna tylko liczyć litery (i zignorować sprawę). To działa dla wszystkich palindromów znalazłem tu odpowiedzi, a ja byłem w stanie nakłonić go do fałszywych negatywów / pozytywów.

Ponadto, jeśli nie podoba bool w programie „C”, to może oczywiście zwrócić int, z powrotem 1 i zwraca 0 na true i false odpowiednio.

Odpowiedział 09/09/2008 o 23:01
źródło użytkownik

głosy
10

Korzystanie z dobrą strukturę danych zwykle pomaga przekonać profesora:

Wcisnąć połowę znaków na stosie (długość / 2).
Pop i porównać każdy char do pierwszego unmatch.
Jeśli stos ma zero elementy: palindrom.
* w przypadku napisu z nieparzystej długości, wyrzucić środkowy char.

Odpowiedział 09/09/2008 o 15:38
źródło użytkownik

głosy
8

Oto sposób pyton. Uwaga: nie jest to, że „pythonic”, ale to pokazuje algorytm.

def IsPalindromeString(n):
    myLen = len(n)
    i = 0
    while i <= myLen/2:
        if n[i] != n[myLen-1-i]:
            return False
        i += 1
    return True
Odpowiedział 09/09/2008 o 15:35
źródło użytkownik

głosy
6

Widzę dużo błędnych odpowiedzi tutaj. Wszelkie poprawne rozwiązanie musi ignorować spacje i znaki interpunkcyjne (i żadnych znaków spoza alfabetu faktycznie) i musi być uwzględniana wielkość liter.

Kilka dobrych przykładów przypadki testowe są:

"Człowiek, plan, kanał, Panama".

„Toyota to Toyota”.

"ZA"

„”

Jak również z pewnymi mało palindromów.

Przykład rozwiązania w C # (uwaga: puste i zerowe ciągi są uważane Palindromes w tym projekcie, jeśli nie jest to pożądane to łatwo zmienić):

public static bool IsPalindrome(string palindromeCandidate)
{
    if (string.IsNullOrEmpty(palindromeCandidate))
    {
        return true;
    }
    Regex nonAlphaChars = new Regex("[^a-z0-9]");
    string alphaOnlyCandidate = nonAlphaChars.Replace(palindromeCandidate.ToLower(), "");
    if (string.IsNullOrEmpty(alphaOnlyCandidate))
    {
        return true;
    }
    int leftIndex = 0;
    int rightIndex = alphaOnlyCandidate.Length - 1;
    while (rightIndex > leftIndex)
    {
        if (alphaOnlyCandidate[leftIndex] != alphaOnlyCandidate[rightIndex])
        {
            return false;
        }
        leftIndex++;
        rightIndex--;
    }
    return true;
}
Odpowiedział 09/09/2008 o 20:14
źródło użytkownik

głosy
6

EDIT: z uwagami:

bool palindrome(std::string const& s) 
{ 
  return std::equal(s.begin(), s.end(), s.rbegin()); 
} 

C ++ sposób.

Mój naiwny realizacja za pomocą eleganckich iteratory. W rzeczywistości, prawdopodobnie sprawdzić i zatrzymać raz naprzód iterator ma swoją przeszłość półmetek do łańcucha.

#include <string>
#include <iostream>

using namespace std;
bool palindrome(string foo)
{
    string::iterator front;
    string::reverse_iterator back;
    bool is_palindrome = true;
    for(front = foo.begin(), back = foo.rbegin();
        is_palindrome && front!= foo.end() && back != foo.rend();
        ++front, ++back
        )
    {
        if(*front != *back)
            is_palindrome = false;
    }
    return is_palindrome;
}
int main()
{
    string a = "hi there", b = "laval";

    cout << "String a: \"" << a << "\" is " << ((palindrome(a))? "" : "not ") << "a palindrome." <<endl;
    cout << "String b: \"" << b << "\" is " << ((palindrome(b))? "" : "not ") << "a palindrome." <<endl;

}
Odpowiedział 09/09/2008 o 15:42
źródło użytkownik

głosy
6
Delphi

function IsPalindrome(const s: string): boolean;
var
  i, j: integer;
begin
  Result := false;
  j := Length(s);
  for i := 1 to Length(s) div 2 do begin
    if s[i] <> s[j] then
      Exit;
    Dec(j);
  end;
  Result := true;
end;
Odpowiedział 09/09/2008 o 15:33
źródło użytkownik

głosy
4
boolean isPalindrome(String str1) {
  //first strip out punctuation and spaces
  String stripped = str1.replaceAll("[^a-zA-Z0-9]", "");
  return stripped.equalsIgnoreCase((new StringBuilder(stripped)).reverse().toString());
}

wersja Java

Odpowiedział 09/09/2008 o 15:29
źródło użytkownik

głosy
3

Rubin:

class String
    def is_palindrome?
        letters_only = gsub(/\W/,'').downcase
        letters_only == letters_only.reverse
    end
end

puts 'abc'.is_palindrome? # => false
puts 'aba'.is_palindrome? # => true
puts "Madam, I'm Adam.".is_palindrome? # => true
Odpowiedział 24/06/2009 o 17:44
źródło użytkownik

głosy
3

C ++

std::string a = "god";
std::string b = "lol";

std::cout << (std::string(a.rbegin(), a.rend()) == a) << " " 
          << (std::string(b.rbegin(), b.rend()) == b);

Grzmotnąć

function ispalin { [ "$( echo -n $1 | tac -rs . )" = "$1" ]; }
echo "$(ispalin god && echo yes || echo no), $(ispalin lol && echo yes || echo no)"

GNU awk

/* obvious solution */
function ispalin(cand, i) { 
    for(i=0; i<length(cand)/2; i++) 
        if(substr(cand, length(cand)-i, 1) != substr(cand, i+1, 1)) 
            return 0; 
    return 1; 
}

/* not so obvious solution. cough cough */
{ 
    orig = $0;
    while($0) { 
        stuff = stuff gensub(/^.*(.)$/, "\\1", 1); 
        $0 = gensub(/^(.*).$/, "\\1", 1); 
    }
    print (stuff == orig); 
}

Haskell

Niektóre martwy mózg robi to w sposób Haskell

ispalin :: [Char] -> Bool
ispalin a = a == (let xi (y:my) = (xi my) ++ [y]; xi [] = [] in \x -> xi x) a

Plain English

"Just reverse the string and if it is the same as before, it's a palindrome"

Odpowiedział 10/11/2008 o 13:09
źródło użytkownik

głosy
3

Ukrywane C wersja:

int IsPalindrome (char *s)
{
  char*a,*b,c=0;
  for(a=b=s;a<=b;c=(c?c==1?c=(*a&~32)-65>25u?*++a,1:2:c==2?(*--b&~32)-65<26u?3:2:c==3?(*b-65&~32)-(*a-65&~32)?*(b=s=0,a),4:*++a,1:0:*++b?0:1));
  return s!=0;
}
Odpowiedział 16/09/2008 o 22:46
źródło użytkownik

głosy
3

Trzy wersje w Smalltalk, z najgłupsze poprawić.


W Smalltalk, =to operator porównania:

isPalindrome: aString
    "Dumbest."
    ^ aString reverse = aString

Komunikat #translateToLowercasezwraca ciąg jako małe litery:

isPalindrome: aString
    "Case insensitive"
    |lowercase|
    lowercase := aString translateToLowercase.
    ^ lowercase reverse = lowercase

Aw Smalltalk, łańcuchy są częścią Collectionramy, można skorzystać z wiadomości #select:thenCollect:, więc o to ostatnia wersja:

isPalindrome: aString
    "Case insensitive and keeping only alphabetic chars
    (blanks & punctuation insensitive)."
    |lowercaseLetters|
    lowercaseLetters := aString
        select: [:char | char isAlphabetic]
        thenCollect: [:char | char asLowercase]. 
    ^ lowercaseLetters reverse = lowercaseLetters
Odpowiedział 09/09/2008 o 16:19
źródło użytkownik

głosy
3

Oto wersja Pythona, który zajmuje się różne przypadki, znaków interpunkcyjnych i spacji.

import string

def is_palindrome(palindrome):
    letters = palindrome.translate(string.maketrans("",""),
                  string.whitespace + string.punctuation).lower()
    return letters == letters[::-1]

Edit: Bezwstydnie ukradli Blair Conrada bardziej zwięzłą odpowiedź, aby usunąć nieco niezdarny przetwarzanie list od mojej poprzedniej wersji.

Odpowiedział 09/09/2008 o 15:49
źródło użytkownik

głosy
3

Oto moje rozwiązanie, bez użycia strrev. Napisany w C #, ale to będzie działać w dowolnym języku, który posiada funkcję długości łańcuch.

private static bool Pal(string s) {
    for (int i = 0; i < s.Length; i++) {
        if (s[i] != s[s.Length - 1 - i]) {
            return false;
        }
    }
    return true;
}
Odpowiedział 09/09/2008 o 15:39
źródło użytkownik

głosy
3

Oto moje rozwiązanie w C #

static bool isPalindrome(string s)
{
    string allowedChars = "abcdefghijklmnopqrstuvwxyz"+
        "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string compareString = String.Empty;
    string rev = string.Empty;

    for (int i = 0; i <= s.Length - 1; i++)
    {
        char c = s[i];

        if (allowedChars.IndexOf(c) > -1)
        {
            compareString += c;
        }
    }


    for (int i = compareString.Length - 1; i >= 0; i--)
    {
        char c = compareString[i];
        rev += c;
    }

    return rev.Equals(compareString, 
        StringComparison.CurrentCultureIgnoreCase);
}
Odpowiedział 09/09/2008 o 15:30
źródło użytkownik

głosy
2

Prostym rozwiązaniem Java:

public boolean isPalindrome(String testString) {
    StringBuffer sb = new StringBuffer(testString);
    String reverseString = sb.reverse().toString();

    if(testString.equalsIgnoreCase(reverseString)) {
        return true;
    else {
        return false;
    }
}
Odpowiedział 18/03/2009 o 20:40
źródło użytkownik

głosy
2

Należy pamiętać, że w powyższych rozwiązań C ++, nie było pewne problemy.

Jednym z rozwiązań było nieskuteczne, ponieważ zdał std :: string przez egzemplarzu, a ponieważ potwierdziło ponad wszelkie znaki, zamiast porównywania tylko połowa znaków. Wtedy, nawet gdy odkrywa łańcuch nie był palindrom, nadal pętli, czekając przed zgłoszeniem jej koniec „false”.

Drugi był lepszy, z bardzo niewielką funkcję, której problemem było to, że nie była w stanie przetestować coś innego niż std :: string. W C ++, to łatwo rozszerzyć algorytm cała masa podobnych obiektów. Przez templating jego std :: string na "T", by to działało na obu std :: string, std :: wstring, std :: vector i std :: deque. Ale bez większych zmian z powodu użycia operatora <, std :: list był poza jego zakres.

Własne rozwiązania starają się pokazać, że rozwiązanie C ++ nie zatrzyma się w prace nad dokładnym rodzaju obecnego, ale będzie dążył do pracy to nic , że zachowuje się w ten sam sposób, bez względu na rodzaj. Na przykład, mogę zastosować moich testów palindrom na std :: string, int na wektorze lub na liście „wszystko” tak długo, jak wszystko było porównywalne za pośrednictwem operatora = (build w rodzaju, jak również klas).

Zauważ, że szablon może zostać przedłużony nawet z opcjonalnym typu, które można wykorzystać do porównania danych. Na przykład, jeśli chcesz porównać w przypadku nieczuły sposób, a nawet porównanie podobnych znaków (takich jak e, E, E, E oraz e).

Jak król Leonidas powiedziałby: „Szablony C ++ to? !!!”

Tak więc, w C ++, istnieją co najmniej 3 główne sposoby, aby to zrobić, każdy z nich prowadzi do drugiego:

Roztwór A: W podobny sposób, c

Problem polega na tym, że do C ++ 0x, nie możemy rozważyć tablicę std :: ciąg znaków jako ciągłe, więc musimy „oszukać” i odzyskać c_str () właściwość. Jak używamy go w trybie tylko do odczytu mody, powinno być ok ...


bool isPalindromeA(const std::string & p_strText)
{
   if(p_strText.length() < 2) return true ;
   const char * pStart = p_strText.c_str() ;             
   const char * pEnd = pStart + p_strText.length() - 1 ; 

   for(; pStart < pEnd; ++pStart, --pEnd)
   {
      if(*pStart != *pEnd)
      {
         return false ;
      }
   }

   return true ;
}

Roztwór B: Bardziej „C ++” wersja

Teraz spróbujemy zastosować to samo rozwiązanie, ale do każdego pojemnika C ++ z losowego dostępu do jego elementów przez operatora []. Na przykład, każdy std :: basic_string, std :: vector, std :: deque itp Operator [] jest stały dostęp do tych pojemników, więc nie stracą nadmiernej prędkości.


template <typename T>
bool isPalindromeB(const T & p_aText)
{
   if(p_aText.empty()) return true ;
   typename T::size_type iStart = 0 ;
   typename T::size_type iEnd = p_aText.size() - 1 ;

   for(; iStart < iEnd; ++iStart, --iEnd)
   {
      if(p_aText[iStart] != p_aText[iEnd])
      {
         return false ;
      }
   }

   return true ;
}

Roztwór C: Szablon Powah!

Będzie pracować z prawie każdym nieuporządkowanej STL-jak pojemnik z iteratorów dwukierunkowych na przykład, każdy std :: basic_string, std :: vector, std :: deque, std :: liście itp Tak, funkcja ta może być stosowany na wszystkich STL -Jak pojemniki z następujących warunków: 1 - T jest pojemnik z dwukierunkowym iteracyjnej 2 - miejsce iteracyjnej T do porównywalnego rodzaju (przez operatora =)


template <typename T>
bool isPalindromeC(const T & p_aText)
{
   if(p_aText.empty()) return true ;
   typename T::const_iterator pStart = p_aText.begin() ;
   typename T::const_iterator pEnd = p_aText.end() ;
   --pEnd ;

   while(true)
   {
      if(*pStart != *pEnd)
      {
         return false ;
      }

      if((pStart == pEnd) || (++pStart == pEnd))
      {
         return true ;
      }

      --pEnd ;
   }
}

Odpowiedział 16/09/2008 o 22:56
źródło użytkownik

głosy
2

Seplenienie:

(defun palindrome(x) (string= x (reverse x)))
Odpowiedział 12/09/2008 o 16:45
źródło użytkownik

głosy
2

Innym C ++ jeden. Zoptymalizowane pod kątem szybkości i wielkości.

bool is_palindrome(const std::string& candidate) {
    for(std::string::const_iterator left = candidate.begin(), right = candidate.end(); left < --right ; ++left)
        if (*left != *right)
            return false;
    return true;
}

Odpowiedział 09/09/2008 o 16:27
źródło użytkownik

głosy
2

Ten kod Java powinien działać wewnątrz logicznej metody:

Uwaga : Musisz tylko sprawdzić pierwsza połowa znaków z tylnej połowie, w przeciwnym razie są nakładających się i podwojenie ilości kontroli, które muszą być wykonane.

private static boolean doPal(String test) {
    for(int i = 0; i < test.length() / 2; i++) {
        if(test.charAt(i) != test.charAt(test.length() - 1 - i)) {
            return false;
        }
    }
    return true;
}
Odpowiedział 09/09/2008 o 15:39
źródło użytkownik

głosy
1

Proste JavaScript rozwiązaniem. Fragment kodu do uruchomienia dema.

function checkPalindrome(line){
      reverse_line=line.split("").reverse().join("");
      return line==reverse_line;
  }
alert("checkPalindrome(radar): "+checkPalindrome("radar"));

Odpowiedział 20/03/2015 o 19:37
źródło użytkownik

głosy
1

Żadne rozwiązanie używając jeszcze JavaScript?

function palindrome(s) {
  var l = 0, r = s.length - 1;
  while (l < r) if (s.charAt(left++) !== s.charAt(r--)) return false;
  return true
}
Odpowiedział 29/12/2011 o 20:57
źródło użytkownik

głosy
1

Erlang jest niesamowite

palindrome(L) -> palindrome(L,[]).

palindrome([],_) -> false;
palindrome([_|[]],[]) -> true;
palindrome([_|L],L) -> true;
palindrome(L,L) -> true;
palindrome([H|T], Acc) -> palindrome(T, [H|Acc]).
Odpowiedział 18/11/2011 o 12:31
źródło użytkownik

głosy
1

Prolog

palindrome(B, R) :-
palindrome(B, R, []).

palindrome([], R, R).
palindrome([X|B], [X|R], T) :-
palindrome(B, R, [X|T]).
Odpowiedział 12/07/2009 o 05:45
źródło użytkownik

głosy
1

Moja 2c. Unika napowietrznej pełnego odwrócenia ciąg każdym razem, wykorzystując shortcircuiting wrócić jak najszybciej charakter ciąg jest ustalona. Tak, należy uzależnić swój ciąg pierwszy, ale IMO to zadanie innej funkcji.

W języku C #

    /// <summary>
    /// Tests if a string is a palindrome
    /// </summary>
    public static bool IsPalindrome(this String str)
    {
        if (str.Length == 0) return false;
        int index = 0;
        while (index < str.Length / 2)
            if (str[index] != str[str.Length - ++index]) return false;

        return true;
    }
Odpowiedział 24/06/2009 o 17:31
źródło użytkownik

głosy
1

c ++:

bool is_palindrome(const string &s)
{
    return equal( s.begin(), s.begin()+s.length()/2, s.rbegin());
}
Odpowiedział 23/10/2008 o 07:16
źródło użytkownik

głosy
1

Perl:

sub is_palindrome {
    my $s = lc shift; # normalize case
    $s =~ s/\W//g;    # strip non-word characters
    return $s eq reverse $s;
}
Odpowiedział 16/09/2008 o 03:29
źródło użytkownik

głosy
1

Pyton:

if s == s[::-1]: return True

Jawa:

if (s.Equals(s.Reverse())) { return true; }

PHP:

if (s == strrev(s)) return true;

Perl:

if (s == reverse(s)) { return true; }

Erlang:

string:equal(S, lists:reverse(S)).
Odpowiedział 11/09/2008 o 11:14
źródło użytkownik

głosy
1

Musiałem zrobić to za wyzwanie programowania, oto fragment mojego Haskell:

isPalindrome :: String -> Bool
isPalindrome n = (n == reverse n)
Odpowiedział 10/09/2008 o 07:08
źródło użytkownik

głosy
1

Używając Java, przy użyciu Apache Commons String Utils:

public boolean isPalindrome(String phrase) {
  phrase = phrase.toLowerCase().replaceAll("[^a-z]", "");
  return StringUtils.reverse(phrase).equals(phrase);
}
Odpowiedział 10/09/2008 o 00:34
źródło użytkownik

głosy
1

Perl:

sub is_palindrome($)
{
  $s = lc(shift); # ignore case
  $s =~ s/\W+//g; # consider only letters, digits, and '_'
  $s eq reverse $s;
}

Pomija obudowę i taśmy innych znaków alfanumerycznych (nie locale- i unicode- neutralne).

Odpowiedział 09/09/2008 o 23:35
źródło użytkownik

głosy
1

W Ruby, konwersja na małe i usuwanie wszystkiego nie alfabetycznej:

def isPalindrome( string )
    ( test = string.downcase.gsub( /[^a-z]/, '' ) ) == test.reverse
end

Ale, że czuje się jak oszustwo, prawda? Brak wskazówek lub cokolwiek! Więc tutaj jest wersja C też, ale bez małych liter i znaków odpędzania dobroci:

#include <stdio.h>
int isPalindrome( char * string )
{
    char * i = string;
    char * p = string;
    while ( *++i ); while ( i > p && *p++ == *--i );
    return i <= p && *i++ == *--p;
}
int main( int argc, char **argv )
{
    if ( argc != 2 )
    {
        fprintf( stderr, "Usage: %s <word>\n", argv[0] );
        return -1;
    }
    fprintf( stdout, "%s\n", isPalindrome( argv[1] ) ? "yes" : "no" );
    return 0;
}

Cóż, to była zabawa - mogę dostać pracę; ^)

Odpowiedział 09/09/2008 o 17:47
źródło użytkownik

głosy
1

Wiele sposobów, aby to zrobić. Myślę, że kluczem jest to zrobić w sposób możliwie najbardziej efektywny (bez pętli ciąg). byłoby to zrobić jako tablica karbonizatu, które mogą być łatwo odwróconych (C #).

string mystring = "abracadabra";

char[] str = mystring.ToCharArray();
Array.Reverse(str);
string revstring = new string(str);

if (mystring.equals(revstring))
{
    Console.WriteLine("String is a Palindrome");
}
Odpowiedział 09/09/2008 o 15:37
źródło użytkownik

głosy
0
// JavaScript Version.
function isPalindrome(str) { 
  str = str.replace(/[^a-zA-Z]/g, '')
  return str.split('').reverse().join('').toUpperCase() === str.toUpperCase()       
}
Odpowiedział 13/09/2015 o 13:42
źródło użytkownik

głosy
0
public static boolean isPalindrome(String str) {
    return str.equals(new StringBuilder(str).reverse().toString());
}

dla wersji Java wcześniej niż 1.5,

public static boolean isPalindrome(String str) {
    return str.equals(new StringBuffer().append(str).reverse().toString());
}

lub

public static boolean istPalindrom(char[] word){
    int i1 = 0;
    int i2 = word.length - 1;
    while (i2 > i1) {
        if (word[i1] != word[i2]) {
            return false;
        }
        ++i1;
        --i2;
    }
    return true;
}
Odpowiedział 12/04/2015 o 08:44
źródło użytkownik

głosy
0
//Single program for Both String or Integer to check palindrome

//In java with out using string functions like reverse and equals method also and display matching characters also

package com.practice;

import java.util.Scanner;

public class Pallindrome {

        public static void main(String args[]) {
        Scanner sc=new Scanner(System.in);
        int i=0,j=0,k,count=0;
        String input,temp;
        System.out.println("Enter the String or Integer");
        input=sc.nextLine();
        temp=input;
        k=temp.length()-1;
        for(i=0;i<=input.length()-1;i++) {
            if(input.charAt(j)==temp.charAt(k)) {
                count++;
            }
            //For matching characters
            j++;
            k--;
        }
                System.out.println("Matching Characters = "+count);

        if(count==input.length()) {
            System.out.println("It's a pallindrome");
        }
        else {
            System.out.println("It's not a pallindrome");
        }

    }

}
Odpowiedział 15/07/2014 o 14:21
źródło użytkownik

głosy
0

Java ze stosów.

public class StackPalindrome {
    public boolean isPalindrome(String s) throws OverFlowException,EmptyStackException{
        boolean isPal=false;
        String pal="";
        char letter;
        if (s==" ")
            return true;
        else{   
            s=s.toLowerCase();
            for(int i=0;i<s.length();i++){

            letter=s.charAt(i);

            char[] alphabet={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
            for(int j=0; j<alphabet.length;j++){
                /*removing punctuations*/
                if ((String.valueOf(letter)).equals(String.valueOf(alphabet[j]))){
                    pal +=letter;
                }

            }

        }
        int len=pal.length();
        char[] palArray=new char[len];
        for(int r=0;r<len;r++){
            palArray[r]=pal.charAt(r);
        }
        ArrayStack palStack=new ArrayStack(len);
        for(int k=0;k<palArray.length;k++){
            palStack.push(palArray[k]);
        }
        for (int i=0;i<len;i++){

            if ((palStack.topAndpop()).equals(palArray[i]))
                isPal=true;
            else 
                isPal=false;
        }
    return isPal;
    }
}
public static void main (String args[]) throws EmptyStackException,OverFlowException{

    StackPalindrome s=new StackPalindrome();
    System.out.println(s.isPalindrome("“Ma,” Jerome raps pot top, “Spare more jam!”"));
}
Odpowiedział 13/05/2014 o 18:38
źródło użytkownik

głosy
0

Ankieter będzie szukał jakiejś logiki, w jaki sposób będzie zbliża ten problem: Należy rozważyć następujący kod Java:

  1. Zawsze należy sprawdzić, czy ciąg wejściowy jest null
  2. sprawdzić przypadki bazowe.
  3. sformatować ciąg odpowiednio (usuń wszystko, co nie jest charakter / cyfrowy
  4. Najprawdopodobniej nie chcą zobaczyć, czy wiesz odwrotnej funkcji oraz porównanie, ale jeśli jesteś w stanie odpowiedzieć na pytanie, za pomocą pętli i indeksowania.
  5. Skrót wrócić jak najszybciej znać odpowiedź i nie marnować środków na nic.

    public static boolean isPalindrome (String s) {

    if (s == null || s.length() == 0 || s.length() == 1)
        return false;
    
    String ss = s.toLowerCase().replaceAll("/[^a-z]/", "");
    
    for (int i = 0; i < ss.length()/2; i++) 
        if (ss.charAt(i) != ss.charAt(ss.length() - 1 - i))
            return false;
    return true;
    

    }

Odpowiedział 10/11/2013 o 19:50
źródło użytkownik

głosy
0

Przypadek-niewrażliwe const-przyjazny wersja prostym C, który ignoruje znaków spoza alfanumeryczne (na przykład spacje / interpunkcyjny). Dlatego rzeczywiście przekazać klasyków jak „mężczyzna, planu, Kanał, Panama”.

int ispalin(const char *b)
{
    const char *e = b;
    while (*++e);
    while (--e >= b)
    {
        if (isalnum(*e))
        {
            while (*b && !isalnum(*b)) ++b;
            if (toupper(*b++) != toupper(*e)) return 0;
        }
    }
    return 1;
}
Odpowiedział 16/02/2013 o 03:53
źródło użytkownik

głosy
0
public class palindrome {
public static void main(String[] args) {
    StringBuffer strBuf1 = new StringBuffer("malayalam");
    StringBuffer strBuf2 = new StringBuffer("malayalam");
    strBuf2.reverse();


    System.out.println(strBuf2);
    System.out.println((strBuf1.toString()).equals(strBuf2.toString()));
    if ((strBuf1.toString()).equals(strBuf2.toString()))
        System.out.println("palindrome");
    else
        System.out.println("not a palindrome");
    }
}   
Odpowiedział 08/02/2013 o 13:45
źródło użytkownik

głosy
0

Regularne Podejście:

flag = True // Assume palindrome is true
for i from 0 to n/2 
 { compare element[i] and element[n-i-1] // 0 to n-1
   if not equal set flag = False
   break }
return flag

Jest lepsza maszyna zoptymalizowana metoda, która wykorzystuje XORs ale ma taką samą złożoność

podejścia XOR :

n = length of string
mid_element = element[n/2 +1]
for i from 0 to n
{ t_xor = element[i] xor element[i+1] }
if n is odd compare mid_element and t_xor
else check t_xor is zero
Odpowiedział 16/02/2012 o 05:45
źródło użytkownik

głosy
0

Jeśli można użyć API Java i dodatkowej przestrzeni dyskowej:

public static final boolean isPalindromeWithAdditionalStorage(String string) {
    String reversed = new StringBuilder(string).reverse().toString();
    return string.equals(reversed);
}

W może potrzebować metodę in-place for Java:

public static final boolean isPalindromeInPlace(String string) {
    char[] array = string.toCharArray();
    int length = array.length-1;
    int half = Math.round(array.length/2);
    char a,b;
    for (int i=length; i>=half; i--) {
        a = array[length-i];
        b = array[i];
        if (a != b) return false;
    }
    return true;
}
Odpowiedział 04/01/2012 o 21:30
źródło użytkownik

głosy
0
public static boolean isPalindrome( String str ) {
    int count = str.length() ;
    int i, j = count - 1 ;
    for ( i = 0 ; i < count ; i++ ) {
        if ( str.charAt(i) != str.charAt(j) ) return false ;
        if ( i == j ) return true ;
        j-- ;
    }
    return true ;
}
Odpowiedział 31/03/2011 o 01:38
źródło użytkownik

głosy
0

Jak o tym przykładzie PHP:

function noitcnuf( $returnstrrevverrtsnruter, $functionnoitcnuf) {
    $returnstrrev  = "returnstrrevverrtsnruter";
    $verrtsnruter = $functionnoitcnuf;
    return (strrev ($verrtsnruter) == $functionnoitcnuf) ; 
}
Odpowiedział 26/02/2011 o 23:42
źródło użytkownik

głosy
0

C # wersja:

Zakłada MyString być char [], powrót Metoda po weryfikacji łańcucha, ignoruje przestrzeń i <,>, ale ten może być przedłużony do ignorowania więcej, prawdopodobnie impleemnt mecz regex z listy ignorowanych.

public bool IsPalindrome()
            if (MyString.Length == 0)
                return false;

            int len = MyString.Length - 1;

            int first = 0;
            int second = 0;

            for (int i = 0, j = len; i <= len / 2; i++, j--)
            {
                while (i<j && MyString[i] == ' ' || MyString[i] == ',')
                    i++;

                while(j>i && MyString[j] == ' ' || MyString[j] == ',')
                    j--;

                if ((i == len / 2) && (i == j))
                    return true;

                first = MyString[i] >= 97 && MyString[i] <= 122 ? MyString[i] - 32 : MyString[i];
                second = MyString[j] >= 97 && MyString[j] <= 122 ? MyString[j] - 32 : MyString[j];

                if (first != second)
                    return false;
            }

            return true;
  }

Szybkie przypadki testowe

ujemny 1. ABCDA 2. AB CBAG 3. # $ BDA 4. NULL / PUSTY

pozytywny 1. ABCBA 2., człowiek plan kanał ,, Panama 3. ABC BA 4. M 5. ACCB

daj mi znać żadnych thoghts / błędów.

Odpowiedział 01/05/2010 o 23:14
źródło użytkownik

głosy
0
    public bool IsPalindrome(string s)
    {
        string formattedString = s.Replace(" ", string.Empty).ToLower();
        for (int i = 0; i < formattedString.Length / 2; i++)
        {
            if (formattedString[i] != formattedString[formattedString.Length - 1 - i])
                return false;
        }
        return true;
    }

Metoda ta będzie pracować dla użądleniu jak „Czy to był szczur widziałem”. Ale czuję, musimy wyeliminować znak specjalny poprzez Regex.

Odpowiedział 12/01/2010 o 14:46
źródło użytkownik

głosy
0

Scala

def pal(s:String) = Symbol(s) equals Symbol(s.reverse)
Odpowiedział 03/07/2009 o 09:53
źródło użytkownik

głosy
0

Const-poprawna C / C ++ rozwiązanie wskaźnik. Minimalny operacje pętli.

int IsPalindrome (const char *str)
{
    const unsigned len = strlen(str);
    const char *end = &str[len-1];
    while (str < end)
        if (*str++ != *end--)
            return 0;
    return 1;
}
Odpowiedział 10/01/2009 o 04:07
źródło użytkownik

głosy
0

Oto kolejny dla C #, że kiedyś, gdy robi kontrolę serwera próbki. Można go znaleźć w książce ASP.NET 3.5 krok po kroku (MS Press). To dwa sposoby, jeden rozebrać nie-znaki alfanumeryczne, a drugi do sprawdzenia za palindrom.

protected string StripNonAlphanumerics(string str)
{
    string strStripped = (String)str.Clone();
    if (str != null)
    {
        char[] rgc = strStripped.ToCharArray();
        int i = 0;
        foreach (char c in rgc)
        {
            if (char.IsLetterOrDigit(c))
            {
                i++;
            }
            else
            {
                strStripped = strStripped.Remove(i, 1);
            }
        }
    }
    return strStripped;
}
protected bool CheckForPalindrome()
{
    if (this.Text != null)
    {
        String strControlText = this.Text;
        String strTextToUpper = null;
        strTextToUpper = Text.ToUpper();
        strControlText =
                    this.StripNonAlphanumerics(strTextToUpper);
        char[] rgcReverse = strControlText.ToCharArray();
        Array.Reverse(rgcReverse);
        String strReverse = new string(rgcReverse);
        if (strControlText == strReverse)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}
Odpowiedział 10/01/2009 o 03:46
źródło użytkownik

głosy
0

Tryb Łatwa w C #, tylko przy użyciu bibliotek klasy bazowej

Edit: Właśnie widziałem też ktoś zrobił Array.reverse

public bool IsPalindrome(string s)
            {
                if (String.IsNullOrEmpty(s))
                {
                    return false;
                }

                else
                {
                    char[] t = s.ToCharArray();
                    Array.Reverse(t);
                    string u = new string(t);
                    if (s.ToLower() == u.ToLower())
                    {
                        return true;
                    }
                }

                return false;
            }
Odpowiedział 10/01/2009 o 03:08
źródło użytkownik

głosy
0

Oto dwie kolejne wersje Perl, z których żaden nie korzysta reverse. Zarówno użyć podstawowego algorytmu porównywania pierwszego znaku łańcucha do ostatniego, a następnie ich odrzucenie i powtórzenie testu, ale używają różnych metod na uzyskanie na poszczególnych znaków (pierwsze peelingi je jeden po drugim z regex, drugi splits ciąg w tablicy znaków).

#!/usr/bin/perl

my @strings = ("A man, a plan, a canal, Panama.", "A Toyota's a Toyota.", 
               "A", "", "As well as some non-palindromes.");

for my $string (@strings) {
  print is_palindrome($string)  ? "'$string' is a palindrome (1)\n"
                                : "'$string' is not a palindrome (1)\n";
  print is_palindrome2($string) ? "'$string' is a palindrome (2)\n"
                                : "'$string' is not a palindrome (2)\n";
} 

sub is_palindrome {
  my $str = lc shift;
  $str =~ tr/a-z//cd;

  while ($str =~ s/^(.)(.*)(.)$/\2/) {
    return unless $1 eq $3;
  }

  return 1;
} 

sub is_palindrome2 {
  my $str = lc shift;
  $str =~ tr/a-z//cd;
  my @chars = split '', $str;

  while (@chars && shift @chars eq pop @chars) {};

  return scalar @chars <= 1;
} 
Odpowiedział 10/01/2009 o 02:47
źródło użytkownik

głosy
0

Efficient C ++ wersja:

template< typename Iterator >
bool is_palindrome( Iterator first, Iterator last, std::locale const& loc = std::locale("") )
{
    if ( first == last )
        return true;

    for( --last; first < last; ++first, --last )
    {
        while( ! std::isalnum( *first, loc ) && first < last )
            ++first;
        while( ! std::isalnum( *last, loc ) && first < last )
            --last;
        if ( std::tolower( *first, loc ) != std::tolower( *last, loc ) )
            return false;
    }
    return true;
}
Odpowiedział 10/01/2009 o 02:15
źródło użytkownik

głosy
0
set l = index of left most character in word
set r = index of right most character in word

loop while(l < r)
begin
  if letter at l does not equal letter at r
    word is not palindrome
  else
     increase l and decrease r
end
word is palindrome
Odpowiedział 16/12/2008 o 15:44
źródło użytkownik

głosy
0

Rozwiązania, które wyrzucić wszelkie znaki, które nie mieszczą się pomiędzy AZ or az angielskiego są bardzo skoncentrowane. Litery ze znakami diakrytycznymi, takich jak lub E będą usuwane!

Według Wikipedii:

Leczenie znaków diakrytycznych różna. W językach takich jak czeskim i hiszpańskim litery ze znakami diakrytycznymi lub akcentami (z wyjątkiem tyldami) nie otrzymują osobne miejsce w alfabecie, a tym samym zachować palindrom czy powtarzane list ma ornamentacji. Jednak w szwedzkich i innych języków skandynawskich, A i A z pierścieniem (A) są różnymi literami i muszą być dublowane dokładnie powinna być traktowana jako prawdziwa palindrom.

Więc obejmować wiele innych języków byłoby lepiej użyć sortowania konwertować znaki diakrytyczne ich odpowiednik non diakrytycznego lub zostawić jako właściwe i następnie rozebrać spacje i znaki interpunkcyjne tylko przed porównaniem.

Odpowiedział 10/11/2008 o 15:35
źródło użytkownik

głosy
0

To wszystko jest dobre, ale czy istnieje sposób, aby zrobić lepsze algorytm? Kiedyś zapytał w wywiadzie rozpoznać palindrom w czasie liniowym i ciągłym przestrzeni .

Nie mogłem myśleć o niczym i wtedy ja wciąż nie mogę.

(Jeśli to nie pomaga, poprosiłem o wywiad, co było odpowiedzią. Powiedział, że można skonstruować parę funkcji mieszania taka, że ​​hash one dany ciąg tej samej wartości, wtedy i tylko wtedy, gdy ciąg jest palindrom. Nie mam pojęcia, jak byś rzeczywiście zrobić to parę funkcji).

Odpowiedział 10/11/2008 o 13:05
źródło użytkownik

głosy
0

Nie widziałem żadnej rekurencji jeszcze, więc tu idzie ...

import re

r = re.compile("[^0-9a-zA-Z]")

def is_pal(s):

    def inner_pal(s):
        if len(s) == 0:
            return True
        elif s[0] == s[-1]:
            return inner_pal(s[1:-1])
        else:
            return False

    r = re.compile("[^0-9a-zA-Z]")
    return inner_pal(r.sub("", s).lower())
Odpowiedział 04/11/2008 o 22:05
źródło użytkownik

głosy
0

Nie jest to pojedynczy rozwiązanie tutaj które bierze pod uwagę fakt, że palindrom mogą być również oparte na jednostkach słownych, nie tylko jednostek znakowych.

Co oznacza, że ​​żadna z podanych rozwiązań return true dla palindromów jak „Dziewczyna, kąpiel na bikini, przyglądając się chłopiec, widzi chłopiec przygląda bikini dziewczyny kąpielowy”.

Oto hacked razem wersja w języku C #. Jestem pewien, że nie potrzebuje regexes, ale działa równie dobrze z powyższym bikini palindromu jak ma to miejsce z „człowiekiem, plan, kana-Panama!”.

    static bool IsPalindrome(string text)
    {
        bool isPalindrome = IsCharacterPalindrome(text);
        if (!isPalindrome)
        {
            isPalindrome = IsPhrasePalindrome(text);
        }
        return isPalindrome;
    }

    static bool IsCharacterPalindrome(string text)
    {
        String clean = Regex.Replace(text.ToLower(), "[^A-z0-9]", String.Empty, RegexOptions.Compiled);
        bool isPalindrome = false;
        if (!String.IsNullOrEmpty(clean) && clean.Length > 1)
        {
            isPalindrome = true;
            for (int i = 0, count = clean.Length / 2 + 1; i < count; i++)
            {
                if (clean[i] != clean[clean.Length - 1 - i])
                {
                    isPalindrome = false; break;
                }
            }
        }
        return isPalindrome;
    }

    static bool IsPhrasePalindrome(string text)
    {
        bool isPalindrome = false;
        String clean = Regex.Replace(text.ToLower(), @"[^A-z0-9\s]", " ", RegexOptions.Compiled).Trim();
        String[] words = Regex.Split(clean, @"\s+");
        if (words.Length > 1)
        {
            isPalindrome = true;
            for (int i = 0, count = words.Length / 2 + 1; i < count; i++)
            {
                if (words[i] != words[words.Length - 1 - i])
                {
                    isPalindrome = false; break;
                }
            }
        }
        return isPalindrome;
    }
Odpowiedział 23/10/2008 o 07:16
źródło użytkownik

głosy
0
boolean IsPalindrome(string s) {
return s = s.Reverse();
}
Odpowiedział 15/09/2008 o 15:23
źródło użytkownik

głosy
0

OCaml:

let rec palindrome s =
  s = (tailrev s)

źródło

Odpowiedział 12/09/2008 o 10:47
źródło użytkownik

głosy
0

Jeśli szukamy liczb i prostych słów, wiele poprawnych odpowiedzi zostały podane.

Jednakże, jeśli patrzymy na to, co zazwyczaj zobaczyć jak palindromów w języku pisanym (np: „Pies, panika, w pagoda!”), Prawidłowa odpowiedź będzie iteracyjne począwszy od obu końcach zdaniu, omijając nie alfanumeryczne znaki indywidualnie i powrocie false jeśli znaleziono żadnych rozbieżności.

i = 0; j = length-1;

while( true ) {
  while( i < j && !is_alphanumeric( str[i] ) ) i++;
  while( i < j && !is_alphanumeric( str[j] ) ) j--;

  if( i >= j ) return true;

  if( tolower(string[i]) != tolower(string[j]) ) return false;
  i++; j--;
}

Oczywiście, pozbawiając się non-poprawnych znaków, cofania wynikowy ciąg i porównując ją do pierwotnego działa również. Wszystko sprowadza się do tego, co rodzaj języka pracujesz.

Odpowiedział 10/09/2008 o 01:22
źródło użytkownik

głosy
0

C # 3 - zwraca Ta fałszywa jak najszybciej char liczony od początku nie pasuje do jego odpowiednika na koniec:

static bool IsPalindrome(this string input)
{
    char[] letters = input.ToUpper().ToCharArray();

    int i = 0;
    while( i < letters.Length / 2 )
        if( letters[i] != letters[letters.Length - ++i] )
            return false;

    return true;
}
Odpowiedział 09/09/2008 o 15:49
źródło użytkownik

głosy
0

Innym jednym z Delphi, które myślę, że jest trochę bardziej rygorystyczne niż w innych np Delphi złożone. To może łatwo przekształcić się w meczu golfa, ale starałem się, aby kopalnia czytelny.

Edit0: Byłem ciekaw cech wydajności, więc zrobiłem mały test. Na moim komputerze, wpadłem tę funkcję przed ciągiem 60 znaków 50 milionów razy, a zajęło to 5 sekund.

function TForm1.IsPalindrome(txt: string): boolean;
var
  i, halfway, len : integer;
begin
  Result := True;
  len := Length(txt);

  {
  special cases:
  an empty string is *never* a palindrome
  a 1-character string is *always* a palindrome
  }
  case len of
    0 : Result := False;
    1 : Result := True;
    else begin
      halfway := Round((len/2) - (1/2));  //if odd, round down to get 1/2way pt

      //scan half of our string, make sure it is mirrored on the other half
      for i := 1 to halfway do begin
        if txt[i] <> txt[len-(i-1)] then begin
          Result := False;
          Break;
        end;  //if we found a non-mirrored character
      end;  //for 1st half of string
    end;  //else not a special case
  end;  //case
end;

I tu jest to samo, w języku C #, chyba że zostawiłem ją z wielu punktów wyjścia, które mi się nie podobają.

private bool IsPalindrome(string txt) {
  int len = txt.Length;

  /*
  Special cases:
  An empty string is *never* a palindrome
  A 1-character string is *always* a palindrome
  */    
  switch (len) {
    case 0: return false;
    case 1: return true;
  }  //switch
  int halfway = (len / 2);

  //scan half of our string, make sure it is mirrored on the other half
  for (int i = 0; i < halfway; ++i) {
    if (txt.Substring(i,1) != txt.Substring(len - i - 1,1)) {
      return false;
    }  //if
  }  //for
  return true;
}
Odpowiedział 09/09/2008 o 15:44
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more