Palindrome program needs improvement

Palindrome program needs improvement



Here a string is taken as input and the program suppose to check whether the string is palindrome or not.
Is there any way the code can be improved? Is it okay to use foreach to break the string into character.


class Program

static void Main(string args)

//input a string
string orginalStr = Console.ReadLine().ToLower(); ;

//call the palindrome method

Console.WriteLine(CheckPalindrome(orginalStr)
? "This is palindrome"
: "This is not palindrome");

Console.ReadKey();


static bool CheckPalindrome(string orginalStr)

//call the string reverse method
var reversedStr = ReverseString(orginalStr);

if (reversedStr.Equals(orginalStr))
return true;

return false;


static string ReverseString(string orginalStr)

string reversedStr = "";

foreach (char ch in orginalStr)

reversedStr = ch + reversedStr;


return reversedStr;






I think this is more efficient. codereview.stackexchange.com/questions/188234/…
– paparazzo
Sep 2 at 16:32





@paparazzo wow! This approach is really simple yet efficient ...Thanks for sharing :)
– AKdeBerg
Sep 2 at 16:53




2 Answers
2



All in all this code does, what you want it to do and you separate responsibility by splitting the code in meaningful functions.



I don't like that CheckPalindrome(...) expects the input to be in a certain format (case). In other words: it should do the preparation of the originalStr by it self and check for invalid input:


CheckPalindrome(...)


originalStr


static bool CheckPalindrome(string orginalStr)

if (string.IsNullOrEmpty(originalStr)) return false;

originalStr = originalStr.ToLower();

//call the string reverse method
var reversedStr = ReverseString(orginalStr);

if (reversedStr.Equals(orginalStr))
return true;

return false;



The palindrome check by comparing the original string with its reversed string is rather inefficient. Instead you can compare each char from the start of the string with the same position from the end of the string. You then only have to iterate through the half of it:


static bool IsPalindrome(string word)

if (string.IsNullOrWhiteSpace(word)) return false;

word = word.ToLower();

for (int i = 0; i < word.Length / 2; i++)

if (word[i] != word[word.Length - i - 1])
return false;


return true;



EDIT



If you go multilingual, you may find this approach useful:


static bool IsPalindrome(string word)

if (string.IsNullOrEmpty(word)) return false;

StringInfo stringInfo = new StringInfo(word.ToLower());
int length = stringInfo.LengthInTextElements;

for (int i = 0; i < length / 2; i++)

if (stringInfo.SubstringByTextElements(i, 1) != stringInfo.SubstringByTextElements(length - i - 1, 1))
return false;


return true;



Disclaimer: I have only tested it on Latin strings, so don't hang me if...





Ah, you are right..I really like your method.It is efficient and concise..Thanks :)
– AKdeBerg
Sep 2 at 11:39





The empty string should be a palindrome, also, a string purely consisting of spaces should be considered a palindrome. If tabs are mixed in, it might not be a palindrome, but this was already handled by the OP's original implementation.
– Gerrit0
Sep 2 at 14:31





@Gerrit0: You may be right about empty strings/white space strings - it's a matter of definition. Tabs works fine if they correspond in position, but of cause not if you consider 't' == ' '
– Henrik Hansen
Sep 3 at 7:57


't' == ' '



return directly


return



Instead of


if (reversedStr.Equals(orginalStr))
return true;



you could do return reverseStr.Equals(originalStr)


return reverseStr.Equals(originalStr)



Always write after an if statement.




This will make it more clear what is part of the if statement


if



Use LINQ to reverse in one go



String reversedStr = new String(originalStr.Reverse().ToArray())


String reversedStr = new String(originalStr.Reverse().ToArray())





reversedStr = char + reversedStr is ABSOLUTELY NOT the same as reversedStr += char.
– gnasher729
Sep 2 at 14:29





Indeed, for string a+b is not the same as b+a. Anyway, it would be better advice to use a 'Stringbuilder' for this instead of creating new strings the whole time.
– oerkelens
Sep 2 at 14:34



Thanks for contributing an answer to Code Review Stack Exchange!



But avoid



Use MathJax to format equations. MathJax reference.



To learn more, see our tips on writing great answers.



Some of your past answers have not been well-received, and you're in danger of being blocked from answering.



Please pay close attention to the following guidance:



But avoid



To learn more, see our tips on writing great answers.



Required, but never shown



Required, but never shown




By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)