使用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来完成,还是需要编辑其他内容?
答案 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");
}
你可以混合两个两个函数来获得漂亮的代码,但我这样做是为了简化。