C++ 代码实现 输入一个仅由可见字符组成的字符串 s。现在要求从中找出一个连续的最长子串,保证这个子串每一位字符都不相同。如果找到多个长度相同的子串,请输出字典序最大的。
时间: 2024-02-15 09:03:34 浏览: 75
以下是 C++ 代码实现:
```cpp
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
string longestSubstring(string s) {
int n = s.length();
int start = 0, end = 0, maxLength = 0;
unordered_map<char, int> charIndex;
for (int i = 0; i < n; i++) {
char c = s[i];
if (charIndex.count(c) != 0 && charIndex[c] >= start) {
start = charIndex[c] + 1;
}
charIndex[c] = i;
if (i - start + 1 > maxLength) {
maxLength = i - start + 1;
end = i;
}
}
return s.substr(end - maxLength + 1, maxLength);
}
int main() {
string s;
cin >> s;
string longestSubstr = longestSubstring(s);
cout << longestSubstr << endl;
return 0;
}
```
代码思路:
利用双指针,一个指向子串的开头,一个指向结尾,遍历整个字符串,通过一个哈希表来记录每个字符出现的位置,如果遇到重复的字符,就更新子串的开头,使得子串满足不含重复字符。每次更新子串时,比较更新后的子串长度与之前的最大长度,如果更长,则更新最大长度和结尾位置。最后返回最长子串即可。
阅读全文