Слово-палиндром, насколько эффективно решена задача - 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)); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д