mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-04 15:39:42 +08:00
merge: Upgraded Algorithm of alpha numeric palindrome (#1006)
* feat: improved memoize function used Map instead of object & used the JSON.stringfy method for generate a valid string as a key * docs: modified documentation * style: format with standard * docs: modified stringify doc * refactor: remove two repetition implementation * feat: added validation, test codes * chore: remove useless words * feat: added types for jest * chore: added link box * feat: added new validation test casses & methods * style: formated with standard * feat: added parse method & test cases * docs: added js docs * chore: added default import export * feat: imporved algorithm via replace method * test: added two test cases * feat: added jest type for suggestions * feat: added `reduceRight` & `trim` method * chore: added helper variable * feat: added new rotation option * Revert "chore: added helper variable" This reverts commit 489544da0a3d479910fbea020d3be3d0d10681bf. * remove: yarn lock * chore: fix grammer * feat: used replace method & added test case * feat: remove revert * chore: added new line * feat: optimized algo n to n / 2 & replaced test cases * chore: update node version * chore: set node version to lts * chore: updated the node version & added engines prop * resolve: removed while loop * chore: added right shift ops comment * chore: update comment * chore: removed abs Co-authored-by: Rak Laptudirm <raklaptudirm@gmail.com>
This commit is contained in:
2
.github/workflows/Ci.yml
vendored
2
.github/workflows/Ci.yml
vendored
@ -14,7 +14,7 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: "14"
|
||||
node-version: "16.x"
|
||||
cache: npm
|
||||
|
||||
- name: 📦 Install dependencies
|
||||
|
@ -1,11 +1,11 @@
|
||||
/*****************************************************************************
|
||||
* @function alphaNumericPlaindrome
|
||||
* @description alphaNumericPlaindrome should return true if the string has alphanumeric characters that are palindrome irrespective of special characters and the letter case.
|
||||
/**
|
||||
* @function alphaNumericPalindrome
|
||||
* @description alphaNumericPalindrome should return true if the string has alphanumeric characters that are palindrome irrespective of special characters and the letter case.
|
||||
* @param {string} str the string to check
|
||||
* @returns {Boolean}
|
||||
* @see [Factorial](https://en.wikipedia.org/wiki/Palindrome)
|
||||
* @returns {boolean}
|
||||
* @see [Palindrome](https://en.wikipedia.org/wiki/Palindrome)
|
||||
* @example
|
||||
* The function alphaNumericPlaindrome() receives a string with varying formats
|
||||
* The function alphaNumericPalindrome() receives a string with varying formats
|
||||
* like "racecar", "RaceCar", and "race CAR"
|
||||
* The string can also have special characters
|
||||
* like "2A3*3a2", "2A3 3a2", and "2_A3*3#A2"
|
||||
@ -13,15 +13,18 @@
|
||||
* But the catch is, we have to check only if the alphanumeric characters
|
||||
* are palindrome i.e remove spaces, symbols, punctuations etc
|
||||
* and the case of the characters doesn't matter
|
||||
*
|
||||
****************************************************************************/
|
||||
*/
|
||||
const alphaNumericPalindrome = (str) => {
|
||||
if (typeof str !== 'string') {
|
||||
throw new TypeError('Argument should be string')
|
||||
}
|
||||
|
||||
const alphaNumericPlaindrome = (str) => {
|
||||
// removing all the special characters and turning everything to lowercase
|
||||
const newStr = str.replace(/[^a-zA-Z0-9]*/g, '').toLowerCase()
|
||||
const newStr = str.replace(/[^a-z0-9]+/ig, '').toLowerCase()
|
||||
const midIndex = newStr.length >> 1 // x >> y = floor(x / 2^y)
|
||||
|
||||
for (let i = 0; i < newStr.length; i++) {
|
||||
if (newStr[i] !== newStr[newStr.length - 1 - i]) {
|
||||
for (let i = 0; i < midIndex; i++) {
|
||||
if (newStr.at(i) !== newStr.at(~i)) { // ~n = -(n + 1)
|
||||
return false
|
||||
}
|
||||
}
|
||||
@ -29,4 +32,4 @@ const alphaNumericPlaindrome = (str) => {
|
||||
return true
|
||||
}
|
||||
|
||||
export { alphaNumericPlaindrome }
|
||||
export default alphaNumericPalindrome
|
||||
|
@ -1,21 +1,21 @@
|
||||
import { alphaNumericPlaindrome } from '../AlphaNumericPalindrome'
|
||||
import alphaNumericPalindrome from '../AlphaNumericPalindrome'
|
||||
|
||||
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => {
|
||||
expect(alphaNumericPlaindrome('eye')).toBe(true)
|
||||
})
|
||||
describe('Testing the alpha numeric palindrome', () => {
|
||||
// should return true if the given string has alphanumeric characters that are palindrome irrespective of case and symbols
|
||||
it('Testing with valid alphabetic palindrome', () => {
|
||||
expect(alphaNumericPalindrome('eye')).toBe(true)
|
||||
expect(alphaNumericPalindrome('Madam')).toBe(true)
|
||||
expect(alphaNumericPalindrome('race CAR')).toBe(true)
|
||||
expect(alphaNumericPalindrome('A man, a plan, a canal. Panama')).toBe(true)
|
||||
})
|
||||
|
||||
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => {
|
||||
expect(alphaNumericPlaindrome('0_0 (: /-:) 0-0')).toBe(true)
|
||||
})
|
||||
it('Testing with number and symbol', () => {
|
||||
expect(alphaNumericPalindrome('0_0 (: /-:) 0-0')).toBe(true)
|
||||
expect(alphaNumericPalindrome('03_|53411435|_30')).toBe(true)
|
||||
})
|
||||
|
||||
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => {
|
||||
expect(alphaNumericPlaindrome('five|_/|four')).toBe(false)
|
||||
})
|
||||
|
||||
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => {
|
||||
expect(alphaNumericPlaindrome('A man, a plan, a canal. Panama')).toBe(true)
|
||||
})
|
||||
|
||||
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => {
|
||||
expect(alphaNumericPlaindrome('1 eye for of 1 eye.')).toBe(false)
|
||||
it('Testing with alphabets and symbols', () => {
|
||||
expect(alphaNumericPalindrome('five|_/|evif')).toBe(true)
|
||||
expect(alphaNumericPalindrome('five|_/|four')).toBe(false)
|
||||
})
|
||||
})
|
||||
|
17
package-lock.json
generated
17
package-lock.json
generated
@ -14,7 +14,7 @@
|
||||
"@babel/preset-env": "^7.11.5",
|
||||
"atob": "2.1.2",
|
||||
"jsdom": "^16.3.0",
|
||||
"node": "^14.13.1",
|
||||
"node": "^16.13.2",
|
||||
"node-fetch": "3.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
@ -25,6 +25,9 @@
|
||||
"husky": "^7.0.4",
|
||||
"jest": "^26.4.2",
|
||||
"standard": "^16.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/code-frame": {
|
||||
@ -8121,9 +8124,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/node": {
|
||||
"version": "14.18.1",
|
||||
"resolved": "https://registry.npmjs.org/node/-/node-14.18.1.tgz",
|
||||
"integrity": "sha512-gBt7GlSQp68Bj5KoYx3dGgMCaE2PN0Qox3oiemTDINYHhJjML/Xd24jXuo7X1ehyJuVNZsLWYrJgX6DhHCze6w==",
|
||||
"version": "16.13.2",
|
||||
"resolved": "https://registry.npmjs.org/node/-/node-16.13.2.tgz",
|
||||
"integrity": "sha512-6x0hohLASL0XaehYn1mrVw1UiiRjoxrujBxjqHGxGe/rFKKCJcDhoa5wNxxvBbyJm6mNgZYuzg0JTwvXmpeWWw==",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"node-bin-setup": "^1.0.0"
|
||||
@ -17157,9 +17160,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node": {
|
||||
"version": "14.18.1",
|
||||
"resolved": "https://registry.npmjs.org/node/-/node-14.18.1.tgz",
|
||||
"integrity": "sha512-gBt7GlSQp68Bj5KoYx3dGgMCaE2PN0Qox3oiemTDINYHhJjML/Xd24jXuo7X1ehyJuVNZsLWYrJgX6DhHCze6w==",
|
||||
"version": "16.13.2",
|
||||
"resolved": "https://registry.npmjs.org/node/-/node-16.13.2.tgz",
|
||||
"integrity": "sha512-6x0hohLASL0XaehYn1mrVw1UiiRjoxrujBxjqHGxGe/rFKKCJcDhoa5wNxxvBbyJm6mNgZYuzg0JTwvXmpeWWw==",
|
||||
"requires": {
|
||||
"node-bin-setup": "^1.0.0"
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
"@babel/preset-env": "^7.11.5",
|
||||
"atob": "2.1.2",
|
||||
"jsdom": "^16.3.0",
|
||||
"node": "^14.13.1",
|
||||
"node": "^16.13.2",
|
||||
"node-fetch": "3.1.1"
|
||||
},
|
||||
"standard": {
|
||||
@ -34,5 +34,8 @@
|
||||
"husky": "^7.0.4",
|
||||
"jest": "^26.4.2",
|
||||
"standard": "^16.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.6.0"
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user