刷算法题:
第一遍:1.看5分钟,没思路看题解
2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。
3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法)
4.整理到自己的自媒体平台。
5.再刷重复的类似的题目,根据时间和任务安排刷哪几个板块
6.用c++语言 都刷过一遍了 就刷中等
一.题目
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
二、反思
1.自己的解法
#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>
using namespace std;
int lengthOfLongestSubstring(string s) {
// 哈希表记录字符最后出现的位置
unordered_map<char, int> charIndexMap;
int maxLength = 0; // 记录最长子串长度
int left = 0; // 左指针
for (int right = 0; right < s.length(); ++right) {
char currentChar = s[right];
// 检查当前字符是否已经在哈希表中存在
if (charIndexMap.find(currentChar) != charIndexMap.end() && charIndexMap[currentChar] >= left) {
// 更新左指针的位置,避免重复字符
left = charIndexMap[currentChar] + 1;
}
// 更新当前字符在哈希表中的位置
charIndexMap[currentChar] = right;
// 更新最大长度
maxLength = max(maxLength, right - left + 1);
}
return maxLength;
}
int main(){
string input;
cout << "请输入一个字符串: ";
cin >> input;
int result = lengthOfLongestSubstring(input);
cout << "最长无重复字符的子串长度为: " << result << endl;
return 0;
}
2.题目的解法
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
int lengthOfLongestSubstring(const string& s) {
unordered_set<char> charSet; // 用于存储当前窗口中的字符
int maxLength = 0; // 记录最长子串的长度
int left = 0; // 左指针,表示窗口的左边界
for (int right = 0; right < s.length(); ++right) {
// 如果字符重复,移动左指针并从集合中移除字符,直到没有重复字符
while (charSet.find(s[right]) != charSet.end()) {
charSet.erase(s[left]);
++left;
}
// 将当前字符添加到集合中
charSet.insert(s[right]);
// 更新最长子串的长度
maxLength = max(maxLength, right - left + 1);
}
return maxLength;
}
int main() {
string s = "abcabcbb";
int length = lengthOfLongestSubstring(s);
cout << "The length of the longest substring without repeating characters is: " << length << endl;
return 0;
}
3.思路的异同
思路上一样,但是用unordered_map<char,int>存储每个字符最后一次出现的索引!这样再遇到有相同字母的情况,无论是不是在窗口的最后,直接left=重复字符的目前最后一个索引+1;
三.进步的地方
很久没有刷算法题了,秋招冲冲冲