mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-04 07:29:47 +08:00
merge: Add new IsPalindrome implementation (#1046)
This commit is contained in:
36
String/IsPalindrome.js
Normal file
36
String/IsPalindrome.js
Normal file
@ -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
|
||||
}
|
33
String/test/IsPalindrome.test.js
Normal file
33
String/test/IsPalindrome.test.js
Normal file
@ -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()
|
||||
})
|
||||
})
|
Reference in New Issue
Block a user