3. Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring,
"pwke"
is a subsequence and not a substring.
思路:
因为只是一个字符串,只涉及到ascii码 ,所以我们将所有的出现的字符序号维持在一个256的数组next(即a在字符串中的序号为1,
那么next[97] = 1,但是序号为2的也是a,那么就会更新next[97] = 2)中,再维持一个变量start(默认为-1)表示最近出现重复字符的序号(比如aba,
当扫描到第一个a的时候,此时没有重复的,那么start=-1, 然后到b也是没有重复,之后到第二个a,那么此时就更新start为之前a的序号即start=0)
代码(python):
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
leng = len(s)
next = [-1]*(256)
start=-1
max_len = 0
for i in xrange(leng):
if next[ord(s[i])] > start:
start = next[ord(s[i])]
next[ord(s[i])] = i
max_len = max(max_len, i-start)
return max_len
while True:
print Solution().lengthOfLongestSubstring(raw_input())
c++
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int leng = s.length();
vector<int >next(256, -1);
int i = 0;
int start = -1;
int max_len = 0;
while(i < leng){
if(next[s[i]] > start){
start = next[s[i]];
}
next[s[i]] = i;
max_len = max(max_len, i-start);
++i;
}
return max_len;
}
};
int main(){
Solution a = Solution();
string temp;
cin>>temp;
cout<<(a.lengthOfLongestSubstring(temp));
return