c++中求一个子字符串中最长并且没有重复字符的子串
时间: 2024-03-20 10:44:53 浏览: 66
以下是用C++实现求一个子字符串中最长且没有重复字符的子串的代码:
```cpp
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
int lengthOfLongestSubstring(string s) {
int len = s.length();
int max_len = 0;
int start = 0;
int end = 0;
unordered_set<char> char_set;
while (end < len) {
if (char_set.find(s[end]) == char_set.end()) { // 当前字符没有出现过
char_set.insert(s[end]); // 将字符加入集合
end++; // 串的右端点右移
max_len = (max_len > end - start) ? max_len : end - start; // 更新最长子串长度
} else { // 当前字符出现过
char_set.erase(s[start]); // 将左端点对应的字符从集合中删除
start++; // 串的左端点右移
}
}
return max_len;
}
int main() {
string s = "abcabcbb";
int max_len = lengthOfLongestSubstring(s);
cout << "Max length of substring: " << max_len << endl;
return 0;
}
```
这里同样采用了滑动窗口的思想,但是使用了C++标准库中的unordered_set容器来存储字符集合。当一个字符第一次出现时,将其加入集合,并将右端点向右移动;当一个字符出现次数大于1时,将其从集合中删除,并将左端点向右移动。在遍历整个字符串的过程中,不断更新最长子串的长度 max_len。
阅读全文