From 36dcff8c5d69938b4f5fa7d7210d0596406b8966 Mon Sep 17 00:00:00 2001 From: P ABHIJIT <138318457+Abhijit-033@users.noreply.github.com> Date: Mon, 2 Oct 2023 22:18:20 +0530 Subject: [PATCH] =?UTF-8?q?feat:=20New=20String=20Algorithm=20for=20Length?= =?UTF-8?q?ofLongestSubstringWithoutRepeati=E2=80=A6=20(#1389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: New String Algorithm for LengthofLongestSubstringWithoutRepeatingCharacters * Fixed Errors and Mistakes in New Algorithm LengthofLongestSubstringWithoutRepetition * fix:#1389 Errors Fixed * fix:#1389 Syntax and Code Errors Fixed * fix:#1389 Errors FIxed * Fixed All new errors * fix:1389 Implemented suggestions and corrections * Use @see annotation --------- Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com> --- ...ngthofLongestSubstringWithoutRepetition.js | 27 +++++++++++++++++++ ...fLongestSubstringWithoutRepetition.test.js | 26 ++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 String/LengthofLongestSubstringWithoutRepetition.js create mode 100644 String/test/LengthofLongestSubstringWithoutRepetition.test.js 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) + }) +})