Leetcode 3. Longest Substring Without Repeating Characters

Leetcode 3. Longest Substring Without Repeating Characters

本题是一个中等题,采用双指针限定滑动窗口范围。官方题解有点让人困惑,总的来说思路和官方题解是一样的,不过官方题解使用 unordered_set。我使用的是 unordered_map 记录字符出现的位置。如果字符出现位置在 [left, right] 之间则代表在 [left, right]之间有重复字符。

本题中 Swift 又体现出独特性,在 Swift 中 String 是无法通过数字索引访问字符的,如果想使用数字索引访问字符,需要先将 String 转为 Character Arraylet sChars = Array(s)。如果你不怕麻烦还可以这样访问:s[s.index(s.startIndex, offsetBy: idx)],写起来还是比较麻烦。

C++

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        if(n == 1) return 1;
        unordered_map<char, int> ht;

        // 双指针
        int left(0), right(1);
        ht[s[0]] = 0;
        int res = 0;

        while(left <= right && right < n) {
            if(ht.find(s[right]) != ht.end() && ht[s[right]] >= left) {
                left = ht[s[right]] + 1;
            }
            ht[s[right]] = right;
            right++;
            res = max(res, right-left);
        }

        return res;
    }
};

Ruby

# @param {String} s
# @return {Integer}
def length_of_longest_substring(s)
    sLength = s.length
    if sLength == 1
        return 1
    end

    left = 0
    right = 1
    ht = {s[0] => 0}
    res = 0
    while left <= right && right < sLength do
        if ht.has_key?(s[right]) && ht[s[right]] >= left
            left = ht[s[right]] + 1
        end

        ht[s[right]] = right
        right = right + 1
        res = [res, right-left].max
    end
    res
end

Python

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n = len(s)
        if n == 1 or n == 0:
            return n
        left = 0
        right = 1
        ht = dict()
        ht[s[0]] = 0
        res = 0
        while left <= right and right < n:
            if s[right] in ht and ht[s[right]] >= left:
                left = ht[s[right]] + 1
            
            ht[s[right]] = right
            right = right + 1
            res = max(res, right-left)
        return res

Swift

class Solution {
    func lengthOfLongestSubstring(_ s: String) -> Int {
        let n = s.count

        let sChars = Array(s)
        if n == 0 || n == 1 {
            return n
        }

        var left = 0, right = 1, res = 0
        var ht: [Character: Int] = [Character:Int]()

        ht[sChars[0]] = 0

        while left <= right && right < n {
            if let idx = ht[sChars[right]], idx >= left {
                left = idx + 1
            }
            ht[sChars[right]] = right
            right = right + 1
            res = max(res, right-left)
        }
        return res
    }
}
posted @ 2022-05-06 16:18  Logan_Xu  阅读(29)  评论(0编辑  收藏  举报