diff --git a/String/IsPalindrome.js b/String/IsPalindrome.js new file mode 100644 index 0000000000..27dca7151f --- /dev/null +++ b/String/IsPalindrome.js @@ -0,0 +1,36 @@ +/** + * @function isPalindromeIterative + * @description isPalindromeIterative function checks whether the provided input is palindrome or not + * @param {String | Number} x - The input to check + * @return {boolean} - Input is palindrome or not + * @see [Palindrome](https://en.wikipedia.org/wiki/Palindrome) + */ + +/* + * Big-O Analysis + * Time Complexity + - O(N) on average and worst case scenario as input is traversed in linear fashion + - O(N) on best case scenario, even when input has length of 1, because toString() method takes O(N) + * Space Complexity + - O(1) +*/ + +export function isPalindromeIterative (x) { + if (typeof x !== 'string' && typeof x !== 'number') { + throw new TypeError('Input must be a string or a number') + } + + // Convert x to string whether it's number or string + const string = x.toString() + const length = string.length + + if (length === 1) return true + + // Apply two pointers technique to compare first and last elements on each iteration + for (let start = 0, end = length - 1; start < end; start++, end--) { + // Early return if compared items are different, input is not a palindrome + if (string[start] !== string[end]) return false + } + // If early return in condition inside for loop is not reached, then input is palindrome + return true +} diff --git a/String/test/IsPalindrome.test.js b/String/test/IsPalindrome.test.js new file mode 100644 index 0000000000..bec42aca26 --- /dev/null +++ b/String/test/IsPalindrome.test.js @@ -0,0 +1,33 @@ +import { isPalindromeIterative } from '../IsPalindrome' + +describe('isPalindrome', () => { + it('expects to return true with empty string', () => { + expect(isPalindromeIterative('')).toEqual(true) + }) + + it('expects to return true when length of input is 1', () => { + const numberInput = 6 + const stringInput = 'a' + expect(isPalindromeIterative(numberInput)).toEqual(true) + expect(isPalindromeIterative(stringInput)).toEqual(true) + }) + + it('expects to return true when input is palindrome', () => { + expect(isPalindromeIterative(121)).toEqual(true) + expect(isPalindromeIterative('yooy')).toEqual(true) + expect(isPalindromeIterative('19noon91')).toEqual(true) + expect(isPalindromeIterative('!*tyyt*!')).toEqual(true) + }) + + it('expects to return false when input is not palindrome', () => { + expect(isPalindromeIterative('hello')).toEqual(false) + expect(isPalindromeIterative(189)).toEqual(false) + expect(isPalindromeIterative('!*98[!')).toEqual(false) + }) + + it('expects to throw error when input is not a string or a number', () => { + expect(() => isPalindromeIterative(undefined)).toThrowError() + expect(() => isPalindromeIterative({ key: 'val' })).toThrowError() + expect(() => isPalindromeIterative([])).toThrowError() + }) +})