最长无重复字符的子串
class Solution {
public:
/*
* @param s: a string
* @return: an integer
*/
int lengthOfLongestSubstring(string &s) {
// write your code here
int arr[256]={0};//ascii all have 256 character
int left=0,i=0,res=0;
while(i<s.size())
{
if(arr[s[i]]==0||arr[s[i]]<left)//if arr[s[i]] is not equal 0 mean
//s[i] aleady exit in front of current position
//arr[s[i]]<left表示当前字母有重复
//但是left右移后开始计算新的字符串所以
//s[i]符合条件可以考虑
res=max(res,i-left+1);
else//遇到下一个和left处相等的字符时转到此处
left=arr[s[i]];
arr[s[i]]=i+1;//这里更新的数为下一个数的下标
i++;
}
return res;
}
};
方法二:用set(参考了别人的代码发现这个解法太妙了)
核心算法和上面的很类似,把出现过的字符都放入set中,遇到set中没有的字符就加入set中并更新结果res,如果遇到重复的,则从左边开始删字符,直到删到重复的字符停止:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set<char> t;
int res = 0, left = 0, right = 0;
while (right < s.size()) {
if (t.find(s[right]) == t.end()) {
t.insert(s[right++]);
res = max(res, (int)t.size());
} else {
t.erase(s[left++]);
}
}
return res;
}
};