3. Longest Substring Without Repeating Characters
给定一个字符串,计算它的最长的没有重复字符的子串的长度。
例子:
输入:abcabcbb
输出:3
输入:bbbbb
输出:1
输入:pwwkew
输出:3
思路
遍历一遍字符串,记录子串的开始位置和结束位置。开始时两个位置都在第一个字符处。接着不断增加子串长度直到结束或者遇到重复字符,如果遇到重复字符,将重复的字符开始出现的位置,作为新的子串的开始位置,然后继续增加子串的长度。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int* record = new int[128] ();
int max_length = 0;
int start = 0;
for (int i = 0; i < s.length(); ++i) {
if (record[s[i]] > start) // 曾经出现过,并且出现位置大于子串开始位置
start = record[s[i]];
record[s[i]] = i; // 记录下每个字符出现的位置
max_length = max(max_length, i - start);
}
return max_length;
}
};
int main() {
Solution solver;
vector<string> text;
text.push_back("abcabcbb");
text.push_back("bbbbb");
text.push_back("pwwkew");
for (int i = 0; i < 3; ++i) {
cout << solver.lengthOfLongestSubstring(text[i]) << std::endl;
}
}
提交了答案后发现错误:
wrong
这应该是因为没有考虑到只有一个字符的情况,以及如果全部初始化为0其实表示第一个元素,等于跳过了第一个元素。
改为下面:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> record(128, -1);
int max_length = 0;
int start = -1;
for (int i = 0; i < s.length(); ++i) {
if (record[s[i]] > start) // 曾经出现过,并且出现位置大于子串开始位置
start = record[s[i]];
record[s[i]] = i; // 记录下每个字符出现的位置
max_length = max(max_length, i - start);
}
return max_length;
}
};
int main() {
Solution solver;
vector<string> text;
text.push_back("abcabcbb");
text.push_back("bbbbb");
text.push_back("pwwkew");
text.push_back(" ");
for (int i = 0; i < 4; ++i) {
cout << solver.lengthOfLongestSubstring(text[i]) << std::endl;
}
}
结果:
Screen Shot 2018-10-07 at 9.28.31 PM.png
网友评论