如何检查给定的字符串是否为回文?

57
定义:
回文是指一个单词、短语、数字或其他序列,在正反方向上读取时具有相同的属性。
如何检查给定的字符串是否是回文?
这曾经是一道常见面试问题,但大多数情况下使用的是 C 语言。
寻找任何一种语言的解决方案。

20
一个男人,一个计划,一个运河,巴拿马。 - Jonathan
22
去挂一条萨拉米。我是占着意大利卷的贪吃鬼。 - xanadont
4
你在意标点符号吗?大小写呢?对于区域敏感的大小写折叠有什么看法? - erickson
好的,我没有考虑到可以忽略的标点问题! - prakash
3
我很失望,据我所知,没有人用堆栈实现它。 - Nick Hodges
@NickHodges,我同意。在迭代字符串时,推入每个字符并弹出并比较。 - BajaBob
69个回答

1
有很多方法可以做到这一点。我想关键是以最有效的方式(而不是循环字符串)进行操作。我会将其作为字符数组完成,这样可以轻松地进行反转(使用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");
}

1

在Ruby中,将字符串转换为小写并去除所有非字母字符:

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

但这感觉就像作弊一样,对吧?没有指针或任何东西!因此,这里也有一个 C 版本,但没有小写和字符剥离的优点:

#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;
}

好的,那很有趣 - 我能得到这份工作吗 ;^)


1

Perl:

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

它忽略大小写并删除非字母数字字符(这是区域设置和 Unicode 中立的)。

1

使用Java,使用Apache Commons字符串工具:

public boolean isPalindrome(String phrase) {
  phrase = phrase.toLowerCase().replaceAll("[^a-z]", "");
  return StringUtils.reverse(phrase).equals(phrase);
}

1

我在一个编程挑战中不得不这样做,这是我的Haskell代码片段:

isPalindrome :: String -> Bool
isPalindrome n = (n == reverse n)

1

Python:

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

Java:

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)).

嗯...如果这是“false”会发生什么?没有返回值?为什么一开始要用“if”呢?直接返回表达式同样有效。 - Konrad Rudolph
1
Java字符串没有.Reverse()方法(.equals()也不是大写的)。 - Michael Myers
所有这些都不起作用,没有一个验证... 尝试这个:"A Santa at NASA" - Azteca

1

c++:

bool is_palindrome(const string &s)
{
    return equal( s.begin(), s.begin()+s.length()/2, s.rbegin());
}

1

还没有使用 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
}

大多数Javascript示例使用s === s.split('').reverse().join('')...赞扬效率 :) - Alex McMillan

1

这是一个简单的JavaScript解决方案。运行代码片段以进行演示。

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


1

Perl:

sub is_palindrome {
    my $s = lc shift; # normalize case
    $s =~ s/\W//g;    # strip non-word characters
    return $s eq reverse $s;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接