题目5:无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
方法一:
//思路:控制区间的所有元素没有重复,使用哈希表来判断。每次重复的时候清空
//哈希表
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
int hashmap[256] = {0};
int flag = 0;
int current = 0;
int result = current;
int i=0;
for(i=0;i<len;i++)
{
if(hashmap[s[i]] != 0)
{
//这个子串有重复
current = i-flag;
if (result < current)
result = current;
//清除哈希表
for(;flag<i;flag++)
{
if(s[flag]!=s[i])
hashmap[s[flag]] = 0;
else
break;
}
hashmap[s[i]] = 1;
flag++;
}
else{
hashmap[s[i]] = 1;//置0
}
}
//处理没有重复的情况。
current = i-flag;
if (result < current)
result = current;
return result;
}
};
方法二:
//方法二:滑动窗口 就是我的方法的进阶。使用hash表来存储字符串上次出现的位置
int lengthOfLongestSubstring(string s) {
vector<int> hash(256,-1);
int left = -1;
int ans = 0;
for(int i=0;i<s.size();++i){
if(hash[s[i]] > left){
left = hash[s[i]];
}
ans = max(ans,i-left);
hash[s[i]] = i;
}
return ans;
}
题目387
字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = "leetcode"
返回 0. s = "loveleetcode", 返回 2.题解:
题解,使用hash表对字符出现的个数进行统计,之后再次遍历字符串查找hash表即可。注意出现次数问题的都可以用这个思路来求解!
// @lc code=start
class Solution {
public:
int firstUniqChar(string s) {
int len = s.size();
int result = 0;
int hashmap[256] = {0};
for(int i=0;i<len;i++)
{
hashmap[s[i]]++;
}
for(int i=0;i<len;i++)
{
if(hashmap[s[i]]==1)
return i;
}
return -1;
}
};//不要遍历哈希表,再遍历一次字符串就好!!!