3. Longest Substring Without Repeating Characters
题目:
Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example 2:
Input: “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example 3:
Input: “pwwkew”
Output: 3
Explanation: 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.
求最长不含重复字符的子字符串的长度。
解法:
O(n):使用hash的方法,用一个hash数组来记录每个字符上一次出现时在原字符串中的位置,用f(i)表示以字符串中第i个字符为结尾的不包含重复字符的子字符串时的最长长度。
如果第i个字符之前没有出现过,那么f(i)=f(i-1)+1;
如果第i个字符出现过,分两种考虑,一种是上一次出现距离这次出现之前的距离d大于f(i-1),则表示以第i-1个字符结尾的最长的不包含重复字符的子字符串中不包含第i个字符,所以f(i)=f(i-1)+1;
第二种就是两个相同的字符出现的距离d小于f(i-1),则f(i) = d。
不停扫描字符串,直到整个字符串都被扫描,返回f中的最大值。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int curLen = 0;
int maxLen = 0;
int pos[256];
memset(pos,-1,sizeof(int)*256);
for(int i = 0;i < s.length();i++)
{
if(pos[s[i]] == -1 || i-pos[s[i]] > curLen)
curLen++;
else
{
if(maxLen < curLen)
maxLen = curLen;
curLen = i - pos[s[i]];
}
pos[s[i]] = i;
}
if(maxLen < curLen)
maxLen = curLen;
return maxLen;
}
};