最长不重复子串与最长不重复子序列

子串与子序列

  • 子串(substring)——在字符串中是连续的
  • 子序列(subsequence)——在字符串中可以不连续,也可以连续

字符串的最长不重复子串

第一次是这样做的时间复杂度为O(n2),就是穷举啦,当然是要超时滴¬_¬

int lengthOfLongestSubstring(string s) {
        if(s == "") return 0;
        int max_len = 1;
        for(int i = 0; i < s.length(); i++){
            for(int j = 0; j < s.length(); j++){
                if(isUnique(s, i, j) && j - i + 1 > max_len){
                    max_len = j - i + 1;
                }
            }
        }
        return max_len;
    }

    bool isUnique(string s, int start, int end){
        int flag = 1;
        for(int i = start; i <= end - 1; i++){
            for(int j = i + 1; j <= end; j++){
                if(s[i] == s[j] && i != j){
                    flag = 0;
                    break;
                }
            }
        }
        if(flag){
            return true;            
        }else{
            return false;
        }
    }

然后改进了下,i和j都只把这个string从开始到结束遍历了一遍,时间复杂度是O(n)

int lengthOfLongestSubstring(string s) {
        int n = s.length(), i = 0, j = 0;
        bool exist[256] = {false};
        int max_len = 0;
        while(j < n){
            if(exist[s[j]]){
                max_len = max(max_len, j - i);
                while(s[i] != s[j]){
                    exist[s[i]] = false;
                    i++;
                }
                i++;
                j++;
            }else{
                exist[s[j]] = true;
                j++;
            }
        }
        max_len = max(max_len, n - i);
        return max_len;
    }

具体分析是参考的这里

字符串最长不重复子序列

字符串中的不重复序列

int lengthOfLongestSubstring(string s) {
        int max_len = 0, flag;
        for(int i = 0; i < s.length(); i++){
            flag = 1;
            for(int j = 0; j < i; j++){
                if(s[i] == s[j]){
                    flag = 0;
                    break;
                }
            }
            if(flag){
                max_len++;
            }
        }
        return max_len;
    }

你可能感兴趣的:(算法)