S2 icon indicating copy to clipboard operation
S2 copied to clipboard

0003. Longest Substring Without Repeating Characters | LeetCode Cookbook

Open halfrost opened this issue 3 years ago • 19 comments

https://books.halfrost.com/leetcode/ChapterFour/0001~0099/0003.Longest-Substring-Without-Repeating-Characters/

halfrost avatar Aug 14 '20 03:08 halfrost

这里的数组index里面的 'a' 应该怎么理解呢?

wahyd4 avatar Oct 10 '20 20:10 wahyd4

@wahyd4 这里的数组index里面的 'a' 应该怎么理解呢?

@wahyd4 'a' 是字母的第一个,减去 'a' 就可以算出该字母在 26 个字母表中的排位。排位就对应的是数组的下标。

halfrost avatar Oct 10 '20 20:10 halfrost

使用数组来做判断是否存在要比map性能好,很棒

crissu avatar Mar 09 '21 06:03 crissu

使用数组来做判断是否存在要比map性能好,很棒

@crissu LeetCode OnlineJudge 就是这样的,有些题如果用 map 性能不好,想办法改成数组,性能就会提升。

halfrost avatar Mar 09 '21 07:03 halfrost

思维跟不上啊 第一次遇到这种只是想到暴力解法先获取所有子字符串再判断重复长度 脑子不够用啊 还是一直没有培养算法和数学思维 难!

hujun2020 avatar Jun 08 '21 08:06 hujun2020

解题思路 太简单了 不太清晰

hujun2020 avatar Jun 08 '21 08:06 hujun2020

看着像那么回事 当时也可以默写下来 过几天再来写肯定某些细节就忘了。

hujun2020 avatar Jun 08 '21 08:06 hujun2020

像这种抽象的就难以捉摸 需要画思维导图

hujun2020 avatar Jun 08 '21 09:06 hujun2020

@hujun2020 我自己写的解法是解法二,我觉得解法二的滑动窗口的思路还挺清晰的。解法一我有点没想到。

halfrost avatar Jun 12 '21 09:06 halfrost

打卡

string = input("input: ")
length = 1 if len(string) else 0
index, characterSet = 0, set()
for index1, character in enumerate(string):
    while character in characterSet:
        characterSet.remove(string[index])
        index += 1
    else:
        characterSet.add(character)
    length = length if length >= index1 - index + 1 else index1 - index + 1
print(f"Output: {length}")

python的if-in结构有时候复杂度是O(n), 有时候是O(1)

chiyoi avatar Aug 08 '21 01:08 chiyoi

方法三的left和right写反了吧

bubbleboy11 avatar Oct 25 '21 01:10 bubbleboy11

@bubbleboy11 没有写反呀。。

halfrost avatar Nov 07 '21 05:11 halfrost

Java打卡3. 无重复字符的最长子串

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int[] lastAt = new int[256];
        for (int i = 0; i <256; ++i) {
            lastAt[i] = -1;
        }
    
        int maxLength = 0;
        int left = 0;

        for (int right = 0; right < s.length(); ++right) {
            int ch = (int) s.charAt(right);
            left = Math.max(left, lastAt[ch] + 1);
            maxLength = Math.max(maxLength, right - left + 1);
            lastAt[ch] = right;
        }

        return maxLength;
    }
}

chen-gongzhe avatar Dec 03 '21 12:12 chen-gongzhe

@halfrost

@wahyd4 这里的数组index里面的 'a' 应该怎么理解呢?

@wahyd4 'a' 是字母的第一个,减去 'a' 就可以算出该字母在 26 个字母表中的排位。排位就对应的是数组的下标。

那为什么freq的长度是256呢?总之因为字符串不止包含小写字母,所以其实没必要 -'a'

Pythonberg1997 avatar Jan 15 '22 08:01 Pythonberg1997

@Loverush

@halfrost

@wahyd4 这里的数组index里面的 'a' 应该怎么理解呢?

@wahyd4 'a' 是字母的第一个,减去 'a' 就可以算出该字母在 26 个字母表中的排位。排位就对应的是数组的下标。

那为什么freq的长度是256呢?总之因为字符串不止包含小写字母,所以其实没必要 -'a'

@Loverush 你说过是有道理的!感谢指点,确实没必要 - 'a',我更改代码啦。

halfrost avatar Jan 16 '22 22:01 halfrost

解法一和解法二其实差不多的,都是滑动窗口的思想

tanggaolin avatar Jul 27 '22 00:07 tanggaolin

不好意思,這題我有解出來,不過看了您的解法想請教 解法1的 var bitSet [256]bool 解法2的 var freq [127]int 這兩個array的宣告數字是怎麼來的? 思考了很久還是想不到,還請您解惑

whitefloor avatar May 26 '23 02:05 whitefloor

你好,你的来件已收到!我会尽快查看邮件!谢谢!

tanggaolin avatar May 26 '23 02:05 tanggaolin

不好意思,這題我有解出來,不過看了您的解法想請教 解法1的 var bitSet [256]bool 解法2的 var freq [127]int 這兩個array的宣告數字是怎麼來的? 思考了很久還是想不到,還請您解惑

@whitefloor bitSet [256],这里的 256 是指的 256 bit 位,用这么长的位做标记。freq [127]int,这里的 127 是指的 127 个字符,这个数组是用来统计每个字符的出现频次的。你可以用更大的数组空间,但是没有必要。比如你写 bitSet [1024],freq [512]int 也是可以的。

halfrost avatar May 26 '23 11:05 halfrost