首页 > 代码库 > 3. Longest Substring Without Repeating Characters

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.

分析

    假设子串里含有重复字符,则父串一定含有重复字符,单个子问题就可以决定父问题,因此可以用贪心法Greedy Algorithm。跟动规不同,动规里,单个子问题只能影响父问题,不足以决定父问题。从左往右扫描,当遇到重复字母时,以上一个重复字母的 index+1,作为新的搜索起始位置,直到最后一个字母,复杂度是 O(n)。
技术分享
该题的关键在于利用一个数组记录每个字母上一次的出现位置 postion
time complexity O(n)
space complexity O(1)
  1. class Solution {
  2. public:
  3. int lengthOfLongestSubstring(string s) {
  4. int start = 0, maxlen = 0, position[128] = {-1};
  5. fill(position, position + 128, -1);
  6. for( int i = 0; i < s.size(); ++i){
  7. if( position[s[i]] >= start){//说明在start后面出现了两个重复字母,需要计算子串
  8. maxlen = max( maxlen, i - start);
  9. start = position[s[i]] + 1;
  10. }
  11. position[s[i]] = i;
  12. }
  13. return max(maxlen, (int)s.size() - start);//不要忘记最后字符串结尾的计算
  14. }
  15. };







来自为知笔记(Wiz)


3. Longest Substring Without Repeating Characters