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.
解题思路:
最简单粗暴的解法:从头到尾,以每个字符开头去扫描一次,一旦遇到与自身字符串中重复的字符,则将字符长度与之前所记录的最大长度进行比较,并且更新最大长度。
代码如下:
#include<string>
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.length() == 0)
return 0;
string temp;
temp = temp+s[0];
int count = 1, max =1;
int start = 1;
for (int i = 1; i < s.length(); i++) {
for (int j = 0; j < temp.length(); j++){
if (s[i] == temp[j]) {
if (count > max) {
max = count;
}
count = 0;
temp = "";
i = start;
start++;
break;
}
}
temp = temp+s[i];
count++;
}
if (count > max) {
max = count;
}
return max;
}
};
这种解法所需要的花费比较高,所以在网上找了另外一种简洁高效的解法。代码如下:
int lengthOfLongestSubstring(string s) {
vector<int> dict(256, -1);//申明一个vector数组,大小空间为256,并且每一位赋值为-1.
int maxLen = 0, start = -1;
for (int i = 0; i != s.length(); i++) {
if (dict[s[i]] > start)
start = dict[s[i]];//发现重复的字符,将start位置挪到扫描得到的重复字符的下一位。
dict[s[i]] = i;//每一个读取到的字符,将它在ascii码表中的位置 赋值为i。
maxLen = max(maxLen, i - start);//比较最大长度和当前扫描得到的字符长度。
}
return maxLen;
}