定义:
回文是指一个单词、短语、数字或其他序列,在正反方向上读取时具有相同的属性。
如何检查给定的字符串是否是回文?
这曾经是一道常见面试问题,但大多数情况下使用的是 C 语言。
寻找任何一种语言的解决方案。
回文是指一个单词、短语、数字或其他序列,在正反方向上读取时具有相同的属性。
如何检查给定的字符串是否是回文?
这曾经是一道常见面试问题,但大多数情况下使用的是 C 语言。
寻找任何一种语言的解决方案。
PHP示例:
$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);
}
移除任何非字母数字字符(空格、逗号、感叹号等),以允许像上面那样的完整句子,以及简单的单词。
适用于Windows XP(可能也适用于2000)或更高版本的批处理脚本:
@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
语言无关的元代码如下...
rev = StringReverse(originalString)
return ( rev == originalString );
C# 原地算法,任何预处理,如大小写不敏感性或去除空格和标点符号应在将其传递给此函数之前完成。
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;
}
编辑: 在循环条件中删除不必要的"+1
",并将节省下来的比较用于删除冗余的长度比较。感谢评论者!
if (s.Length < 2)
是多余的。如果 s.Length < 2,则 s.Length / 2 == 0,因此 i < 0 == false -> 返回 true。 - jfsC#: LINQ
var str = "a b a";
var test = Enumerable.SequenceEqual(str.ToCharArray(),
str.ToCharArray().Reverse());
对 Hal 的 Ruby 版本 进行更加符合 Ruby 风格的重写:
class String
def palindrome?
(test = gsub(/[^A-Za-z]/, '').downcase) == test.reverse
end
end
palindrome?
。未优化的Python:
>>> def is_palindrome(s):
... return s == s[::-1]
def ispal(iterable): s = list(iterable); return s == s[::-1]
是有效的。 - jfsJava解决方案:
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!");
}
}
大家好,这里是C语言。 (不确定您是否希望在此处提供C语言示例)
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;
}
对于"racecar", "Racecar", "race car", "racecar ", 和 "RaCe cAr",该程序会返回true。如果需要考虑符号或空格,也很容易进行修改,不过我认为只统计字母(忽略大小写)更加实用。这个程序适用于我在这里找到的所有回文,我也无法通过任何手段让它产生假阴性或假阳性。
此外,如果你不喜欢在"C"程序中使用bool,显然可以改为返回int,其中return 1表示true,return 0表示false。
使用良好的数据结构通常有助于给教授留下深刻印象:
将一半字符推入堆栈(长度/ 2)。 弹出并比较每个字符,直到第一个不匹配为止。 如果堆栈没有元素:回文。 *在长度为奇数的字符串的情况下,抛掉中间字符。