创建回文

本文关键字:回文 创建 | 更新日期: 2023-09-27 18:34:05

namespace Palindrome
{
    class Program
    {
        public static bool IsPalindrome(string s)
        {
            int min = 0;
            int max = s.Length - 1;
            while (true)
            {
                if (min > max) // True if we've compared up to, and then gone passed the middle of the string.
                    return true;
                if (char.ToLower(s[min++]) != char.ToLower(s[max]))
                    return false;
            }
        }
        static void Main(string[] args)
        {
            string [] words = {
                                "civic",
                                "deified",
                                // ...
                                "stats",
                                "tenet",
                             };
            foreach (string value in words)
            {
                Console.WriteLine("{0} = {1}", value, IsPalindrome(value));
            }
                   Console.WriteLine("'nPress any key to continue...");
            Console.ReadKey(true);        }
    }
}

程序检查单词数组中的单词是否是回文(单词向前拼写与向后拼写相同)。

Main 中的 foreach 循环将数组中的每个单词传递给 IsPalindrome() 函数;该函数测试该单词,并相应地返回 True 或 False。

由于当前数组中的每个单词都是回文,因此当程序运行时,它应该输出所有当前单词,后跟 True。 但是,它给了我错误。为什么?

创建回文

在我看来,

您似乎忘记了减小max的值; 即以下内容:

if (char.ToLower(s[min++]) != char.ToLower(s[max]))

。应该是:

if (char.ToLower(s[min++]) != char.ToLower(s[max--]))

无论如何,如果您在调试模式下运行它并逐步完成代码,您应该能够很快清除它。

尝试

if (char.ToLower(s[min++]) != char.ToLower(s[max--]))
                return false;

我想你忘了递减max变量。

现在,您只需将每个字母与最后一个字母进行比较即可。

你已经得到了关于代码问题问题的答案。这是一个更干净的解决方案选项(如果您不需要任何性能优化):

public static bool IsPalindrome(string s)
{
   char[] array = s.ToCharArray();
   Array.Reverse(array);
   string backwards = new string(array);
   return s.Equals(backwards, StringComparison.OrdinalIgnoreCase);
}

你必须降低你的最大值。

对于另一种测试方法。

var input = "abba";
var output = input.ToCharArray().Reverse().Aggregate("",(x,y) => x + y));
return input.Equals(output, StringComparison.OrdinalIgnoreCase);

你去吧,一个更好的文化/不区分大小写的版本

using System.Globalization;
bool IsPalindrome(string value, StringComparer comparer = null)
{
    if (s == null)
    {
        throw new ArgumentNullException("value");
    }
    if (comparer == null)
    {
        comparer = StringComparer.CurrentCultureIgnoreCase;
    }
    var elements = new List<string>();
    var m = StringInfo.GetTextElementEnumerator(value);
    while (m.MoveNext())
    {
        elements.Add(m.GetTextElement());
    }
    var i = 0;
    var j = elements.Count - 1;
    var limit = elements.Count / 2;
    for(; i <= limit; i++, j--)
    {
        if (!comparer.Equals(elements[i], elements[j]))
        {
            return false;
        }
    }
    return true;
}