c++ 不重复字符数最多的字符串[已关闭]

mbzjlibv  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(109)

已关闭。此问题需要details or clarity。它目前不接受回答。
**希望改进此问题?**通过editing this post添加详细信息并阐明问题。

4天前关闭。
Improve this question
到目前为止,我认为这看起来很棒。我遇到的唯一问题是从集合中删除元素并递增左指针。我得到一些错误的输出,而一些正确的。需要一些逻辑上的帮助。这是一个典型的leet代码问题3,其中要求打印最大数量的不重复字符串字符。我面临的问题是在循环中

if (iter != stringSet.end()) {
            while (*stringSet.begin() != c) {
                stringSet.erase(stringSet.begin());
                left++;
            }

字符串
我试过“abcabcbb”,我应该得到3,但我得到了4。

class Solution {
    public:
    int lengthOfLongestSubstring(string s) {
        int left = 0;
        int right = 0;
        int maxlength = 0;
        set<char> stringSet;
        
        for (;right < s.length(); right++) {
            char c = s[right];
            
            auto iter = stringSet.find(c); 
            
            if (iter != stringSet.end()) {
                while (*stringSet.begin() != c) {
                    stringSet.erase(stringSet.begin());
                    left++;
                }
             
              
            } else {
                stringSet.insert(c);
                maxlength = max(maxlength, right-left+1);
            }
        }
        
        return maxlength;
    }
};

ujv3wf0j

ujv3wf0j1#

问题是,当您找到一个重复的字符时,您只是从集合的开头擦除元素,直到重复的字符被删除。但是,这种方法是不正确的,因为集合中可能有其他字符仍然存在于当前子字符串中。
要解决此问题,您需要从集合中擦除元素,直到删除重复字符,并调整左指针以移动到删除的重复字符之后的位置。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 0;
        int right = 0;
        int maxlength = 0;
        set<char> stringSet;
        
        while (right < s.length()) {
            char c = s[right];
            
            auto iter = stringSet.find(c); 
            
            if (iter != stringSet.end()) {
                while (*stringSet.begin() != c) {
                    stringSet.erase(s[left]); // Erase elements from the set using the character value, not the iterator
                    left++;
                }
                
                stringSet.erase(s[left]); // Erase the repeated character itself
                left++; // Move the left pointer to the position after the removed repeated character
            } else {
                stringSet.insert(c);
                maxlength = max(maxlength, right - left + 1);
                right++;
            }
        }
        
        return maxlength;
    }
};

字符串

相关问题