(leetcode) Longest Substring Without Repeating Characters

来源:互联网 发布:服务器性能监控软件 编辑:程序博客网 时间:2024/06/08 08:31

Question :

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.


code :

class Solution {public:  int lengthOfLongestSubstring(string s){      if(s.size()<=1) return s.size();     int A[256];     int start = 0,Max = 0;     int len = 0;     //bool flag = false;     for(int i = 0;i<256;i++)         A[i]=-1;     for(int i = 0;i<s.size();i++)     {         if(A[s[i]] >= 0)         {             //flag = true;            // len = i-start;             int j = A[s[i]];             for(;start<=j;start++)                A[s[start]] = -1;         }         //if(Max<len&&flag == true) Max = len;         //if(flag ==false&&Max<(i-start +1))         if(Max<(i-start +1))         {             Max = i - start +1;         }         A[s[i]]=i;     }    return Max; }};

思想:运用一个start记录当前没有重复字母的字符串的头节点。

1、用字母自身作为下标,刚开始只考虑了26个字母,结果提交上去错误,说包含‘,’之类的字符实例不通过。所以这里是申请256大小的int 数组,存储每一个字符所在的下标。

2、若该字母没出现过则存储下标,并计算当前字母到起始字母start的长度,并跟max比较,比max大,则替换max。

3、出现过,则将该A[s[i]]的下一位记为start。并将前一start到当前start中间的字母置为未出现。之后重复操作。


注:

1、刚开始的想法是遇到s中第i个字母不是第一次出现,则记录当前len长度,len = i - start;

2、如果没遇到相同的字母则len = i- start +1;

但是发现者这样略麻烦,因为i处字母不是第一次出现说明start到i-1处字母都是第一次出现,这个长度已经计算过并跟Max进行了比较,所以在i再次计算就是重复计算了,这里可以省去。



    


0 0