找到一个字符串中三个最长的独特回文的算法

时间:2014-09-17 13:32:52

标签: c#

使用C#,编写一个算法来查找字符串中三个最长的独特回文。对于三个最长的回文,报告回文文本,开始索引和长度的长度降序。例如,字符串的输出

sqrrqabccbatudefggfedvwhijkllkjihxymnnmzpop 

应该是:

Text: hijkllkjih, Index: 23, Length: 10 Text: defggfed, Index: 13, Length: 8 Text: abccba, Index: 5 Length: 6 

现在我到了可以写出回文及其长度的部分,但我对索引有问题。需要有关如何包含回文索引以及如何获得独特长度的帮助

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string inputString = "sqrrqabccbatudefggfedvwhijkllkjihxymnnmzpop";
            string currentStr = string.Empty;
            List<string> listOfPalindromes = new List<string>();

            char[] inputStrArr = inputString.ToCharArray();

            for (int i = 0; i < inputStrArr.Length; i++)
            {
                for (int j = i+1; j < inputStrArr.Length; j++)
                {
                    currentStr = inputString.Substring(i, j - i + 1);

                    if (IsPalindrome(currentStr))
                    {
                        listOfPalindromes.Add(currentStr);
                    }
                }
            }

            var longest = (from str in listOfPalindromes
                           orderby str.Length descending
                           select str).Take(3);

            foreach (var item in longest)
            {
                Console.WriteLine("Text: " + item.ToString() + " Index: " +  + " Length: " + item.Length.ToString());
            }
        }

        private static bool IsPalindrome(String str)
        {
            bool IsPalindrome = true;
            if (str.Length > 0)
            {
                for (int i = 0; i < str.Length / 2; i++)
                {
                    if (str.Substring(i, 1) != str.Substring(str.Length - (i + 1), 1))
                    {
                        IsPalindrome = false;
                    }
                }
            }
            else
            {
                IsPalindrome = false;
            }
            return IsPalindrome;
        }
    }
}

好了,现在我该如何获得不同的长度?可以通过使用DISTINCT来完成,还是需要编辑其他内容?

3 个答案:

答案 0 :(得分:1)

发现回文时需要存储更多信息。

首先定义一个类:

class PalindromeResult
{
    public string Text { get; set; }
    public int Index { get; set; }
}

然后,而不是您的List<string>,创建此类的列表:

List<PalindromeResult> listOfPalindromes = new List<PalindromeResult>();

找到结果时,请按照

进行广告
if (IsPalindrome(currentStr))
{
    listOfPalindromes.Add(new PalindromeResult { Text = currentStr, Index = i});
}

您必须相应地更新排序和打印。

答案 1 :(得分:0)

最佳解决方案(正如Sinatr所指出的那样)是在你找到它们时存储回文索引。

您可以使用IndexOf函数来查找字符串中第一次出现的子字符串的索引。

例如,您可以在inputString.IndexOf(item)函数中使用Console.WriteLine

答案 2 :(得分:0)

试试这个

public static bool IsPalindromic(int l)
    {
        IEnumerable<char> forwards = l.ToString().ToCharArray();
        return forwards.SequenceEqual(forwards.Reverse());
    }

    public int LongestPalindrome(List<int> integers)
    {
        int length=0;
        int num;
        foreach (var integer in integers)
        {
            if (integer.ToString().Length > length)
            {
                num = integer;
                length = integer.ToString().Length;
            }
        }
        return num;
    }


    public void  MyFunction(string input)
    {

        var numbers = Regex.Split(input, @"\D+").ToList();
        var allPalindromes = (from value in numbers where !string.IsNullOrEmpty(value) select int.Parse(value) into i where IsPalindromic(i) select i).ToList();
        if (allPalindromes.Count>0)
            Console.WriteLine(LongestPalindrome(allPalindromes));
        else
            Console.WriteLine("Any Palindrome number was found");

    }

你可以混合两个两个函数来获得漂亮的代码,但我这样做是为了简化。