您的位置:首页 > 其它

[LeetCode] 3. Longest Substring Without Repeating Characters

2018-02-19 19:39 537 查看

3. Longest Substring Without Repeating Characters (最长无重复子序列)

Longest Substring Without Repeating Characters 最长无重复子序列
题目翻译

解题方法

代码

1. 题目翻译

给定一个字符串,找出最长不重复子序列。

例子:

输入: "abcabcbb"
输出: 3("abc")
输入: "bbbbb"
输出: 1("b")
输入: ""pwwkew""
输出: 3("wke")


注意子序列必须是连续的。

2. 解题方法

使用hash保存出现过的字符和位置。使用一个cur变量记录当前子序列长度,start变量记录当前子序列起始位置。遍历字符串,有三种可能:

如果当前字符没出现过,就将该字符与下标存到hash中,当前子序列长度cur加1。

如果当前字符出现过,但是上一次出现的位置不在当前记录的子序列中,就把当前长度cur加1,并把该字符在hash中的位置更新。

如果当前字符出现过,并且上一次出现的位置在当前子序列中,说明该子序列含有重复字符了,就把start变为上一次出现位置的后一个(这样可以保证子序列中没有重复字符)。然后将当前子序列长度更新,并把当前字符的位置更新。

3. 代码

//Runtime: 35ms
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char,int> H;
map<char,int>::iterator it;

int max = 0;
int start = 0;
int cur = 0;

for(int i = 0;i<s.size();i++){
it = H.find(s[i]);
if(it==H.end()){
H.insert(pair<char,int>(s[i],i));
cur++;
}
94dd
else{
if(it->second<start){
cur++;
}else{
start = it->second + 1;
cur = i - start + 1;
}
it->second = i;
}
max = max>cur?max:cur;
}
max = max>cur?max:cur;
return max;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: