Слово-палиндром, насколько эффективно решена задача - C#
Формулировка задачи:
Здравствуйте, вот готовлюсь к ЕГЭ, тренируюсь решать С4.
Скажите пожалуйста, насколько эффективно решена эта задача:
На вход программы подаются прописные латинские буквы, ввод этих символов заканчивается
точкой. Напишите эффективную по времени работы и по используемой памяти программу
(укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая
будет определять, можно ли переставить эти буквы так, чтобы получился палиндром (палиндром
читается одинаково слева направо и справа налево). Программа должна вывести ответ «Да»
или «Нет», а в случае ответа «Да» – еще и сам полученный палиндром (первый в алфавитном
порядке).
Пример входной строки:
GAANN
Пример выходных данных:
Да
ANGNA
Заранее благодарю
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication6
{
class Program
{
static void Main()
{
List<char> list = new List<char>();
list = Console.ReadLine().ToList();
var symbols = list.Where(e=>e!='.').GroupBy(e => e).OrderBy(g => g.Key).Select(g => g); //Descending для большего по алфавиту(последним в алфавитном порядке)
if(symbols.Count(g=>g.Count()%2!=0)>1||symbols.Count(g=>g.Count()%2==0)<1)
{
Console.WriteLine("No");
return;
}
string str = string.Empty;
foreach (var symbol in symbols)
{
if(symbol.Count()%2!=0) continue;
str += symbol.Aggregate("", (current, a) => current + a);
}
string line = string.Empty;
int i = 0;
while(i<=str.Length-1)
{
line += str[i];
i += 2;
}
string insered = symbols.First(g => g.Count()%2 != 0).Aggregate("", (current, a) => current + a);
Console.WriteLine("Yes\n"+line+insered+new string(line.Reverse().ToArray()));
Console.ReadKey();
}
}
}Решение задачи: «Слово-палиндром, насколько эффективно решена задача»
textual
Листинг программы
using System;
namespace ConsoleAppTesting
{
class Test
{
public static void Main(string[] args)
{
var enteredstring = "ASDBBBFAAUAAAAFFGUHASDHFG.rxd";
const int dictsize = 'Z' - 'A' + 1;
var s = enteredstring.Substring(0, enteredstring.IndexOf('.'));
var cnt = new int[dictsize];
foreach (var ch in s) cnt[ch - 'A']++;
int oddcnt = 0, oddidx = -1;
for (var i = 0; i < dictsize; i++)
if (cnt[i] % 2 == 1) { oddcnt++; oddidx = i; };
if (oddcnt > 1) { Console.WriteLine("No"); }
else
{
Console.WriteLine("Yes");
for (var i = 0; i < dictsize; i++) outstring(cnt, oddidx, i);
if (oddidx >= 0) Console.Write((char)('A' + oddidx));
for (var i = dictsize - 1; i >= 0; i--) outstring(cnt, oddidx, i);
}
Console.ReadKey();
}
private static void outstring(int[] cnt, int oddidx, int i)
{
if (cnt[i] > 0)
Console.Write(new string((char)('A' + i), cnt[i] / 2));
}
}
}