diff --git a/String/LengthofLongestSubstringWithoutRepetition.js b/String/LengthofLongestSubstringWithoutRepetition.js new file mode 100644 index 000000000..42b5894b7 --- /dev/null +++ b/String/LengthofLongestSubstringWithoutRepetition.js @@ -0,0 +1,27 @@ +/* + * @description : Given a string, the function finds the length of the longest substring without any repeating characters + * @param {String} str - The input string + * @returns {Number} The Length of the longest substring in a given string without repeating characters + * @example lengthOfLongestSubstring("abcabcbb") => 3 + * @example lengthOfLongestSubstring("bbbbb") => 1 + * @see https://leetcode.com/problems/longest-substring-without-repeating-characters/ + */ + +const lengthOfLongestSubstring = (s) => { + if (typeof s !== 'string') { + throw new TypeError('Invalid Input Type') + } + let maxLength = 0 + let start = 0 + const charMap = new Map() + for (let end = 0; end < s.length; end++) { + if (charMap.has(s[end])) { + start = Math.max(start, charMap.get(s[end]) + 1) + } + charMap.set(s[end], end) + maxLength = Math.max(maxLength, end - start + 1) + } + return maxLength +} + +export { lengthOfLongestSubstring } diff --git a/String/test/LengthofLongestSubstringWithoutRepetition.test.js b/String/test/LengthofLongestSubstringWithoutRepetition.test.js new file mode 100644 index 000000000..81e475ced --- /dev/null +++ b/String/test/LengthofLongestSubstringWithoutRepetition.test.js @@ -0,0 +1,26 @@ +import { lengthOfLongestSubstring } from '../LengthofLongestSubstringWithoutRepetition' + +describe('LengthOfLongestSubstring', () => { + it('should throw error if parameter is not string', () => { + expect(() => lengthOfLongestSubstring(345)).toThrowError(TypeError) + expect(() => lengthOfLongestSubstring(true)).toThrowError(TypeError) + expect(() => lengthOfLongestSubstring(null)).toThrowError(TypeError) + }) + + it('should check substrings containing unique characters', () => { + expect(lengthOfLongestSubstring('abcabcbb')).toBe(3) + expect(lengthOfLongestSubstring('bbbbb')).toBe(1) + expect(lengthOfLongestSubstring('pwwkew')).toBe(3) + expect(lengthOfLongestSubstring(' ')).toBe(1) + expect(lengthOfLongestSubstring('abcdefghijklmnaaaaa')).toBe(13) + }) + + it('should give zero for empty strings', () => { + expect(lengthOfLongestSubstring('')).toBe(0) + }) + + it('should be case-sensitive', () => { + expect(lengthOfLongestSubstring('AaBbCc')).toBe(3) + expect(lengthOfLongestSubstring('AbCdEf')).toBe(6) + }) +})