leetcode 3.无重复字符的最长子串
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路
方法一:
使用双层循环的方法去匹配
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int res = 0;
for(int i=0; i<s.size(); i++){
set<char> temp; // 用于存储不相同的元素
int count = 0;
for(int j=i; j<s.size(); j++){
if(temp.find(s[j]) == temp.end()){ // 查找是否含有该字符
count++; // 记录不重复的字符的个数
temp.insert(s[j]); // 没有找到,直接在集合中插入
}
else{
break; // 表示找到了重复的字符,直接退出
}
}
if(count > res){ // 更新结果,把最长的子字符串存储在res中
res = count;
}
}
return res;
}
};
方法二: 滑动窗口的解法
假设有一个子字符串 s i j s_{ij} sij,我们要知道第 j j j个字符是否在 s i j s_{ij} sij中,采用不断的去 i i i开始取出来,与 j j j相比较。如果全都不相等, j j j往前进一步,如果中间有一个相等的,那么 i = i n d e x i=index i=index,那么不相等的子字符串的长度就是 i − j + 1 i-j+1 i−j+1。代码如下
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int index = 0, maxLen = 0;
for (int i=0; i<s.size(); i++){
for(int j = index; j < i; j++){
if(s[j] == s[i]){
index = j+1;
break;
}
}
if((i-index+1) > maxLen){
maxLen = i-index+1;
}
}
return maxLen;
}
};
升级一下,用哈希表映射的方法。把字符串中每个字符的下标都映射到对应的位置,这样当找到重复的字符,就直接跳到对应的左侧窗口的位置,没有找到重复的就不断的下标向前走,并且记录当前子字符串的长度。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> ascii(256, 0);
int index = 0, maxLen = 0;
for(int i=0; i<s.size(); i++){
if(index < ascii[s[i]]){
index = ascii[s[i]];
}
ascii[s[i]] = i+1;
if(maxLen < (i-index+1)){
maxLen = i-index+1;
}
}
return maxLen;
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步