LeetCoder 3. Longest Substring Without Repeating Characters

来源:互联网 发布:知乎怎么发图片文章 编辑:程序博客网 时间:2024/05/21 08:03

题意

求一个字符串的最长连续不重复子串

思路

解法一
暴力,两层循环枚举起点和终点,一层循环判断这段字符串中是否存在重复的字符,时间复杂度O(n3)
解法二
尺取法,设置左右两个指针,右指针不断向前移动直到出现重复的字符,出现重复字符之后,左指针开始前进,直到找到那个重复的字符并越过,然后继续,中间记录最长的连续不重复子串长度,时间复杂度O(n)
解法三
使用一个 hash 表记录当前寻找的序列的起点,以字符为keyvalue 为所处位置,如果发现当前遍历字符在hash 表中,更新起点,中间不断的进行长度的检查.注意:初始化 hash 表中每个 keyvalue 都要为-1,因为我们下次取得起点为 value+1

结果

Your runtime beats 33.07% of cpp submissions.

代码

解法二:

class Solution {public:    map<int, int>vis;    int lengthOfLongestSubstring(string s) {        vis.clear();        int l = 0;        int r = 0;        int len = s.length();        int cnt = 0;        int ans = 0;        while(1){            int flag = 0;            if(cnt != 0){                cnt--;                vis[s[r] - 'a']--;            }            while(flag == 0 && r < len){                if(vis[s[r] - 'a'] != 0){                    vis[s[r] - 'a']++;                    flag = 1;                    break;                }                vis[s[r] - 'a'] = 1;                r++;                cnt++;            }            ans = cnt > ans ? cnt : ans;            if(l >= r || flag == 0){                break;            }            while(flag != 0 && l <= r){                if(vis[s[l] - 'a'] != 1){                    flag = 0;                }                vis[s[l] - 'a']--;                l++;                if(flag != 0)                cnt--;            }        }        return ans;    }};

解法三:

class Solution {public:    int mp[300];    int lengthOfLongestSubstring(string s) {        int len = s.length();        int startLoc = -1;        int ans = 0;        for(int i = 0; i < 300; i++){            mp[i] = -1;        }        for(int i = 0 ; i < len; i++){            startLoc = max(startLoc, mp[s[i]] + 1);            mp[s[i]] = i;            ans = max(ans, i - startLoc + 1);        }        return ans;    }};
0 0
原创粉丝点击