检查一个字符串是否是回文字符串

29
我有一个字符串作为输入,需要将该字符串分成两个子字符串。如果左侧子字符串等于右侧子字符串,则执行一些逻辑。
我该如何实现?
示例:
public bool getStatus(string myString)
{

}

例子: myString = "ankYkna",如果我们把它分成两个子字符串,它们将是: left-part = "ank", right-part = "ank"(反转后)。


你在这里遇到的实际问题是什么?只需使用 myString.SubString() - ken2k
@ken2k 如何将一个字符串分割成两个相等的子字符串。 - ankur
1
所以你只是想检查这个字符串是否是一个字谜吗? - Thomas Levesque
实际上我指的是回文,不是变位词...感谢cadrell0给出正确的单词 ;) - Thomas Levesque
我得到了那个东西,这就是重点。 - ankur
目前的答案都没有正确识别出所有回文,只是回文的一个子集。我已经包含了所有回文的解决方案,例如回文句子。 - Patrick Kelly
33个回答

100

仅供娱乐:

return myString.SequenceEqual(myString.Reverse());

7
缺少“using System.Linq;” - Junior Mayhé

34
public static bool getStatus(string myString)
{
    string first = myString.Substring(0, myString.Length / 2);
    char[] arr   = myString.ToCharArray();

    Array.Reverse(arr);

    string temp   = new string(arr);
    string second = temp.Substring(0, temp.Length / 2);

    return first.Equals(second);
}

3
这实际上对于带标点和不对称空格的回文无效。 例如:"No 'X' in Nixon." 是一个回文。 - Espen

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

1
稍微快一点的方法是将 length / 2 保存在它自己的变量中。 - krillgar

16

使用LINQ,当然远非最佳解决方案。

var original = "ankYkna";
var reversed = new string(original.Reverse().ToArray());
var palindrom = original == reversed;

一个字符串本质上就是一个字符数组,所以.ToCharArray()调用是多余的。 - krillgar
@krillgar 你是正确的,string 实现了 IEnumerable<char>,所以 ToCharArray 不是必须的。我无法确定它在2012年是否也是这样。 - Adrian Iftode
2
我非常确定这一直是事实,但当LINQ首次推出时,人们非常明确。我刚刚偶然发现了这个问题,并想向其他看到你的扎实答案的人指出这一点。 - krillgar
3
为了区分大小写,请添加String.Equals(word,original,StringComparison.OrdinalIgnoreCase)。 - afr0

15

使用Linq的一行代码

public static bool IsPalindrome(string str)  
{
    return str.SequenceEqual(str.Reverse());
}

如果字符串中包含特殊字符或数字,这将失败。在执行操作之前,您可以先检查它们。str = new string(s.Where(char.IsLetterOrDigit).ToArray()).ToLower(); - Sudi Dav

7
 public static bool IsPalindrome(string value)
        {
            int i = 0;
            int j = value.Length - 1;
            while (true)
            {
                if (i > j)
                {
                    return true;
                }
                char a = value[i];
                char b = value[j];
                if (char.ToLower(a) != char.ToLower(b))
                {
                    return false;
                }
                i++;
                j--;
            }
        }

3

在C#中:

public bool EhPalindromo(string text)
{
 var reverseText = string.Join("", text.ToLower().Reverse());
 return reverseText == text;
}

3

//这个C#方法将检查偶数和奇数长度的回文字符串

public static bool IsPalenDrome(string palendromeString)
        {
            bool isPalenDrome = false;

            try
            {
                int halfLength = palendromeString.Length / 2;

                string leftHalfString = palendromeString.Substring(0,halfLength);

                char[] reversedArray = palendromeString.ToCharArray();
                Array.Reverse(reversedArray);
                string reversedString = new string(reversedArray);

                string rightHalfStringReversed = reversedString.Substring(0, halfLength);

                isPalenDrome = leftHalfString == rightHalfStringReversed ? true : false;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return isPalenDrome;
        }

2

这是一种检查回文的简短高效方法。

bool checkPalindrome(string inputString) {

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

    return true;

}

1
使用这种方式从dotnetperls链接中获取。
  using System;

    class Program
    {
        /// <summary>
        /// Determines whether the string is a palindrome.
        /// </summary>
        public static bool IsPalindrome(string value)
        {
            int min = 0;
            int max = value.Length - 1;
            while (true)
            {
                if (min > max)
                {
                    return true;
                }
                char a = value[min];
                char b = value[max];

                // Scan forward for a while invalid.
                while (!char.IsLetterOrDigit(a))
                {
                    min++;
                    if (min > max)
                    {
                        return true;
                    }
                    a = value[min];
                }

                // Scan backward for b while invalid.
                while (!char.IsLetterOrDigit(b))
                {
                    max--;
                    if (min > max)
                    {
                        return true;
                    }
                    b = value[max];
                }

                if (char.ToLower(a) != char.ToLower(b))
                {
                    return false;
                }
                min++;
                max--;
            }
        }

        static void Main()
        {
            string[] array =
            {
                "A man, a plan, a canal: Panama.",
                "A Toyota. Race fast, safe car. A Toyota.",
                "Cigar? Toss it in a can. It is so tragic.",
                "Dammit, I'm mad!",
                "Delia saw I was ailed.",
                "Desserts, I stressed!",
                "Draw, O coward!",
                "Lepers repel.",
                "Live not on evil.",
                "Lonely Tylenol.",
                "Murder for a jar of red rum.",
                "Never odd or even.",
                "No lemon, no melon.",
                "Senile felines.",
                "So many dynamos!",
                "Step on no pets.",
                "Was it a car or a cat I saw?",

                "Dot Net Perls is not a palindrome.",
                "Why are you reading this?",
                "This article is not useful.",
                "...",
                "...Test"
            };

            foreach (string value in array)
            {
                Console.WriteLine("{0} = {1}", value, IsPalindrome(value));
            }
        }
    }

请在您的代码中添加描述,解释它的功能。 - Rahul Gupta
请查看IsPalindrome函数顶部的注释 :) - FAREH

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