Longest Substring Without Repeating Characters

来源:互联网 发布:淘宝买家诈骗怎么办 编辑:程序博客网 时间:2024/06/11 11:42

1.题目

给定一个字符串,请找出其中无重复字符的最长子字符串

例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3

对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1

2.算法

基本思路是维护一个窗口,窗口左侧和右侧边界都向右侧走,当扫描右边界下个元素时,如果窗口中没有正在扫描的元素,则把正在扫描的元素放在窗口中,如果有则记录当前子串长度和最优解的比较结果,左边界不断向后扫描,直到扫描到一个字符和右相同,右边继续扫描,知道到字符串尾

    public int lengthOfLongestSubstring(String s) {        // write your code here        if (s == null || s.length() == 0)        {            return 0;        }        HashSet<Character> hs = new HashSet<Character>();        int l = 0; //窗口左        int r = 0;  //窗口右        int max = 0;  //最大窗口        while (r < s.length())        {            if (hs.contains(s.charAt(r))) //如元素重复            {                if (max < r - l)  //保留最大                {                    max = r - l;                }                while (s.charAt(l) != s.charAt(r))  //移动左边界,直到没有重复                {                    hs.remove(s.charAt(l));                    l++;                }                l++;            }            else  //没有重复            {                hs.add(s.charAt(r));            }            r++;        }        max = Math.max(max, r - l);        return max;    }

python

    def lengthOfLongestSubstring(self, s):        # write your code here        ans = 0        left = 0        last = {}        for i in range(len(s)):            if s[i] in last and last[s[i]] >= left:                left = last[s[i]] + 1            last[s[i]] = i            ans = max(ans, i - left + 1)        return ans


0 0
原创粉丝点击