leetcode-Longest Substring Without Repeating Characters-3

找出字符串的最长不重复子串的长度
直观的做法是枚举以每个元素为开头的最长不重复子串,更新长度,时间复杂度是ON^2,空间O1
更高效的做法:用一个hash表保存每个字符最后出现的下标,用一个指针i,表名当前最长不重复子串的首位置,遍历字符串,在hash表中找到当前字符最后一次出现的位置记为k,如果k>=i,说明当前字符在当前最长不重复子串中出现过了,那么更新i和hash[s[j]]。只需遍历一遍,时间复杂度是ON,空间O256(ascii字符其实只需128就够了)

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int i=0;
        int vis[300];
        for(int j=0;j<300;j++) vis[j]=-1;
        int ans=0;
        if(s.size()==0) return 0;
        if(s.size()==1) return 1;
        int len=s.size();
        for(int j=0;jsize();j++){
            if(vis[s[j]]>=i){
                ans=max(ans,j-i);
                cout<" "<" "<1;
            }
            vis[s[j]]=j;
        }
        ans=max(ans,len-i);
        return ans;
    }
};

你可能感兴趣的:(leetcode)