Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 42 additions & 10 deletions String/CheckPangram.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,54 @@
/*
Pangram is a sentence that contains all the letters in the alphabet
https://en.wikipedia.org/wiki/Pangram
/**
* What is Pangram?
* Pangram is a sentence that contains all the letters in the alphabet https://en.wikipedia.org/wiki/Pangram
*/

const checkPangram = (string) => {
/**
* @function checkPangramRegex
* @description - This function check pangram with the help of regex pattern
* @param {string} string
* @returns {boolean}
* @example - checkPangramRegex("'The quick brown fox jumps over the lazy dog' is a pangram") => true
* @example - checkPangramRegex('"Waltz, bad nymph, for quick jigs vex." is a pangram') => true
*/
const checkPangramRegex = (string) => {
if (typeof string !== 'string') {
throw new TypeError('The given value is not a string')
}

/**
* Match all 26 alphabets using regex, with the help of:
* Capturing group - () -> Groups multiple tokens together and creates a capture group for extracting a substring or using a backreference.
* Character set - [a-z] -> Matches a char in the range a to z in case-insensitive for the 'i' flag
* Negative lookahead - (?!) -> Specifies a group that can not match after the main expression (if it matches, the result is discarded).
* Dot - . -> Matches any character except linebreaks. Equivalent to
* Star - * -> Matches 0 or more of the preceding token.
* Numeric reference - \{$n} -> Matches the results of a capture group. E.g. - \1 matches the results of the first capture group & \3 matches the third.
*/
return string.match(/([a-z])(?!.*\1)/gi).length === 26
}

/**
* @function checkPangramSet
* @description - This function detect the pangram sentence by HashSet
* @param {string} string
* @returns {boolean}
*/
const checkPangramSet = (string) => {
if (typeof string !== 'string') {
throw new TypeError('The given value is not a string')
}

const frequency = new Set()
const lettersSet = new Set()

for (const letter of string.toLowerCase()) {
if (letter >= 'a' && letter <= 'z') {
frequency.add(letter)
for (const letter of string.toUpperCase()) {
if (/[A-Z]/.test(letter)) {
// if the letter is a valid uppercase alphabet then the add method insert the letter to the HashSet
lettersSet.add(letter)
}
}

return frequency.size === 26
return lettersSet.size === 26
}

export { checkPangram }
export { checkPangramRegex, checkPangramSet }
52 changes: 42 additions & 10 deletions String/test/CheckPangram.test.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,65 @@
import { checkPangram } from '../CheckPangram'
import { checkPangramRegex, checkPangramSet } from '../CheckPangram'

describe('checkPangram', () => {
describe('Testing checkPangramRegex function', () => {
it('"The quick brown fox jumps over the lazy dog" is a pangram', () => {
expect(
checkPangram('The quick brown fox jumps over the lazy dog')
).toBeTruthy()
checkPangramRegex('The quick brown fox jumps over the lazy dog')
).toBe(true)
})

it('"Waltz, bad nymph, for quick jigs vex." is a pangram', () => {
expect(checkPangram('Waltz, bad nymph, for quick jigs vex.')).toBeTruthy()
expect(checkPangramRegex('Waltz, bad nymph, for quick jigs vex.')).toBe(true)
})

it('"Jived fox nymph grabs quick waltz." is a pangram', () => {
expect(checkPangram('Jived fox nymph grabs quick waltz.')).toBeTruthy()
expect(checkPangramRegex('Jived fox nymph grabs quick waltz.')).toBe(true)
})

it('"My name is Unknown" is NOT a pangram', () => {
expect(checkPangram('My name is Unknown')).toBeFalsy()
expect(checkPangramRegex('My name is Unknown')).toBe(false)
})

it('"The quick brown fox jumps over the la_y dog" is NOT a pangram', () => {
expect(
checkPangram('The quick brown fox jumps over the la_y dog')
).toBeFalsy()
checkPangramRegex('The quick brown fox jumps over the la_y dog')
).toBe(false)
})

it('Throws an error if given param is not a string', () => {
expect(() => {
checkPangram(undefined)
checkPangramRegex(undefined)
}).toThrow('The given value is not a string')
})
})

describe('Testing checkPangramSet function', () => {
it('"The quick brown fox jumps over the lazy dog" is a pangram', () => {
expect(
checkPangramSet('The quick brown fox jumps over the lazy dog')
).toBe(true)
})

it('"Waltz, bad nymph, for quick jigs vex." is a pangram', () => {
expect(checkPangramSet('Waltz, bad nymph, for quick jigs vex.')).toBe(true)
})

it('"Jived fox nymph grabs quick waltz." is a pangram', () => {
expect(checkPangramSet('Jived fox nymph grabs quick waltz.')).toBe(true)
})

it('"My name is Unknown" is NOT a pangram', () => {
expect(checkPangramSet('My name is Unknown')).toBe(false)
})

it('"The quick brown fox jumps over the la_y dog" is NOT a pangram', () => {
expect(
checkPangramSet('The quick brown fox jumps over the la_y dog')
).toBe(false)
})

it('Throws an error if given param is not a string', () => {
expect(() => {
checkPangramSet(undefined)
}).toThrow('The given value is not a string')
})
})