给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
14ms
注意使用unordered_map时把字符和该字符的索引作为键值对,这样可以节省一次查找重复字符索引的循环
#include <string>
#include <unordered_map>using namespace std;int lengthOfLongestSubstring(string s) {int n = s.length();if (n == 0) {return 0;}unordered_map<char, int> charIndex;int maxLength = 0;int start = 0;for (int end = 0; end < n; ++end) {char currentChar = s[end];if (charIndex.find(currentChar) != charIndex.end()) {start = max(start, charIndex[currentChar] + 1);}charIndex[currentChar] = end;maxLength = max(maxLength, end - start + 1);}return maxLength;
}
在上面的代码中,我们维护了一个滑动窗口,通过start和end指针来表示窗口的开始和结束位置。我们使用charIndex哈希表来存储每个字符最后一次出现的位置。当遇到重复字符时,我们将窗口的起始位置更新为重复字符的下一个位置,并计算当前最大子串长度。最终返回最大子串的长度。
在C++的std::map中,可以使用[]操作符来进行索引,但需要注意以下两点:
- 如果key存在,则[]操作符返回对应key的值;
- 如果key不存在,则[]操作符会创建一个新的key-value对,并将其插入到map中,value初始化为该类型的默认值。
因此,在上面提到的代码中,使用charIndex[currentChar] = end;这一行代码时,如果currentChar在charIndex中不存在,会创建一个新的key-value对并赋值。这种方式适合于我们在遍历字符串过程中动态更新字符最后出现的位置信息。