logseq_notes/pages/OJ notes/pages/Leetcode Longest-Substring-Without-Repeating-Characters.md
2023-06-14 14:27:22 +08:00

2.3 KiB

Leetcode Longest-Substring-Without-Repeating-Characters

2022-07-14 09:33

Algorithms:

#algorithm #Kadane_s_algorithm #sliding_window

Data structures:

#DS #string

Difficulty:

#coding_problems #difficulty_medium

Additional tags:

#leetcode

Revisions:

N/A

Problem

Given a string s, find the length of the longest substring without repeating characters.

Examples

Example 1:

Input: s = "abcabcbb" Output: 3 Explanation: The answer is "abc", with the length of 3.

Example 2:

Input: s = "bbbbb" Output: 1 Explanation: The answer is "b", with the length of 1.

Example 3:

Input: s = "pwwkew" Output: 3 Explanation: The answer is "wke", with the length of 3. Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.

Constraints

  • 0 <= s.length <= 5 * 104
  • s consists of English letters, digits, symbols and spaces.

Thoughts

[!summary] This is a #Kadane_s_algorithm

Initially, I thought of a kadane's algo, but implemented wrong.

Then I figured out kadane's algorithm.

similar to this one. Leetcode Best-Time-To-Buy-And-Sell-Stock

The goal is making cur as small as possible, without duplicating

And the localMax is max(localMax, i - cur)

Solution

Kadane's algorithm

class Solution {
public:
int lengthOfLongestSubstring(string s) {
  // Kadane's algorithm
  vector<int> hMap(255, -1);

  int cur = -1;
  int localMax = 0;

  for (int i = 0; i < s.length(); i++) {
    if (hMap[s[i]] > cur) {
      // If the element occurs again, reset
      cur = hMap[s[i]];
    }

    hMap[s[i]] = i;
    // The char at cur is ignored
    localMax = max(localMax, i - cur);
  }
  return localMax;
}
};

Initial solution

class Solution {
public:
int lengthOfLongestSubstring(string s) {
  unordered_map<char, int> hMap;
  int cur = 0;
  int localMax = 0;

  for (int i = 0; i < s.size(); i++) {
    if (hMap.find(s[i]) == hMap.end()) {
      cur++;
      localMax = max(cur, localMax);
      hMap[s[i]] = i;
    } else {
      i = hMap[s[i]];
      hMap.clear();
      cur = 0;
    }
  }
  return localMax;
}
};