[C#] Домашно Strings and Text Processing - 20 задача


8

Условие: Write a program that extracts from a given text all palindromes, e.g. "ABBA", "lamal", "exe".

Решениеsource.

Обяснение: Разделяме стринга на отделни думи. За всяка от тях проверяваме дали е палиндром, като сравняваме първата буква с последната, втората с предпоследната и т.н. докато стигнем средата на думата.




Отговори



1

Решение: source

С регулярен израз извличам думите от текста и след това в един цикъл ги проверявам дали са палиндром, ако са ги добавям в списък, който печатам накрая.


от stanchev (197 точки)


0
Нищо против теб, но трябва ли да си постнеш всичките задачи за стрингове на един път и да оспамиш толкова жестоко форума ... На началната страница не се вижда нищо друго освен [C#] Домашно Strings and Text Processing ...................

от westi3m (5621 точки)

0
Останаха още 3 :). Извинявам се ако се е получило така, но сега имам време да ги постна, а и е по-добре наведнъж да след всяка задача да поствам.

от stanchev (197 точки)


6

Решение

Първо премахвам всички ненужни знаци с помощта на .Split(). За всяка дума извиквам метода isPalindrome(). Взимам индекса на средата на думата, като деля дължината и на две. Въртя цикъл от 0 до средата и записвам буквите в leftSide. След това въртя цикъл от края на думата до средата и записвам буквите в rightSide (ако средата е четно число, то трябва да взимам и символа, който стои в средата). Сравнявам leftSide и rightSide. Ако са равни значи думата е палиндром.


от teleriknetwork (2734 точки)


0
Няколко грешки забелязвам в съжденията ти. Т.е. не са грешки, безмислени операции са. Първо - защо ти трябва да гледаш ЦЯЛАТА дума? При първо несъответствие на лява и огледална дясна буква отсвирваш думата и почваш със следващата. Второ - много се заиграваш със средната буква :) Работи само с word.Lenght/2. При четен брой знаци ще си имаш 2 равни половинки от думата, при нечетен буквата в средата ще остане неизползвана от нито една от половинките, което всъщност е правилния подход - от нея нищо не зависи. Ето аз как съм направил проверката (даже не ми се качва някъде кода) :
static bool IsPalindrome(string s) { for (int i = 0; i < s.Length / 2; i++) if (s[i] != s[s.Length - i-1]) return false; return true; }
П.С. Трябва да се отуча от навика да икономисвам къдравите скоби... :) ма поне на мен така кода ми изглежда по-прибран. Иначе в тоя пример трябваше да има още 4 реда ...
П.С.С. Намерих начин да сваля още поне 5% (а вероятно над 20% при нормално дълги думи и повечко палиндроми между тях) от времето за изпълнение на програмата чрез пипане в тоя метод :) . Да видим някой може ли да се сети как...

от JulianG (5316 точки)

0
Прав си, колега. Правя малко излишни проверки.

от teleriknetwork (2734 точки)


-1

Решение

Обяснение: В динамичен масив записвам думите, разделени с интервал. В метода ReverseText() се обръща всяка дума, като използвам класа StringBuilder и метода му Append().


от cchapo (583 точки)


0

GitHub

Сплитвам си стринга на отделни думи и за всяка една от тях проверявам като сравнявам първата с последната втората с пред последната и т.н. Накрая добавям проверка дали думата не е от една буква.


от dzhenko (3893 точки)


0
https://gist.github.com/DobromirZlatkov/8436690
Едно по-кратко решение, което мисля, че работи.



1
Едно решение и от мен, савсем лек регулярен израз колкото да хванем думите и в случая интересното е как намирам дали е палиндром - използвам метода Reverse за да обърна местата на буквите и после я правя пак дума, като проверявам дали са еднакви
string input = "Write a program that extracts from a given text all palindromes, e.g. ABBA, lamal, exe."; string regex = @"\b\w+\b"; foreach (Match item in Regex.Matches(input, regex)) { string reversed = String.Join("", item.Value.Reverse()); if (item.Value == reversed && reversed.Length > 1) { Console.WriteLine(reversed); } }
ПП
сори за постването на кода тук, просто е много къс

от Sir_EFO (733 точки)


0
Ето и едно решение от мен:
http://pastebin.com/x6gh8K1u
Правя проверка за симетрия на масив, описан в главата "Масиви" от учебника.

от LERRY (582 точки)


0
Една оптимизация би била да сложиш един break след установяването на несиметричност в първия if, но думите не са много дълги по принцип :Р Но пък може да проверява числа, знам ли :)
Друго нещо, което може би намалява четимостта, но на мен лично ми допада е, във foreach-а, на мястото на колекцията можеш направо да сложиш Console.ReadLine().Split() (спейсът се подразбира, ако не подадеш нищо).
Можеш да сложиш всякаква IEnumerable колекция там (май), без да я пазиш в променлива. Иначе foreach e мааалко по-бавен от for и ако не ползвам това, направо си предпочитам for. :)

от georgiwe (720 точки)