zoukankan      html  css  js  c++  java
  • [LeetCode] 3.Longest Substring Without Repeating Characters 最长无重复子串

    Given a string, find the length of the longest substring without repeating characters.

    Example 1:

    Input: "abcabcbb"
    Output: 3 
    Explanation: The answer is "abc", with the length of 3. 
    

    Example 2:

    Input: "bbbbb"
    Output: 1
    Explanation: The answer is "b", with the length of 1.
    

    Example 3:

    Input: "pwwkew"
    Output: 3
    Explanation: The answer is "wke", with the length of 3. 
                 Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

    滑动窗口法,右指针从左往右扫描字符串,遇到没出现过的字符就直接记录,当扫到的字符出现过,左指针一直向右走,直到遇到重复字符时,左指针在右移1位。比较当前不重复字符串长度与max值,更新max值。最后返回max值。

    字符的记录可用hashmap或int[256], 记录和查寻字符的方式有两种:

    第一种记录每个字符上次出现的位置,当遇到新字符时,直接记录字符位置。当遇到的字符存在时,如果记录的位置小于左指针的位置,说明被跳过了,重新记录当前位置。当遇到重复的字符存在并且在左指针右边(在窗口内)时,指针直接跳到记录的这个字符上次出现的位置加1,就是跳过这个字符,然后记录这个新的位置。

    第二种记录字符是否出现,如果扫到重复的字符,左指针向右移动,到重复字符的位置加1,这之间扫过的字符都删掉,因为不在窗口里了。

    Java:

      public int lengthOfLongestSubstring(String s) {
            if (s.length()==0) return 0;
            HashMap<Character, Integer> map = new HashMap<Character, Integer>();
            int max=0;
            for (int i=0, j=0; i<s.length(); ++i){
                if (map.containsKey(s.charAt(i))){
                    j = Math.max(j,map.get(s.charAt(i))+1);
                }
                map.put(s.charAt(i),i);
                max = Math.max(max,i-j+1);
            }
            return max;
        }  

    Java: HashMap

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            HashMap<Character, Integer> map = new HashMap<Character,Integer>();
            int maxLen = 0;
            int start = 0;
            for (int i = 0; i< s.length(); i++) {
                if (!map.containsKey(s.charAt(i)) || map.get(s.charAt(i)) < start) {
                    map.put(s.charAt(i),i);
                }
                else {
                    maxLen = Math.max(maxLen,i - start);
                    start = map.get(s.charAt(i)) + 1;
                    map.put(s.charAt(i),i);
                }
            }
    
            maxLen = Math.max(maxLen, s.length() - start);
    
            return maxLen;
        }
    }
    

    Java 2: HashSet

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int longest = 0;
            int i = 0;
            Set<Character> set = new HashSet<>();
            
            for (int j = 0; j < s.length(); j++) {
                while (set.contains(s.charAt(j))) {
                    set.remove(s.charAt(i));
                    i++;
                }
                
                set.add(s.charAt(j));
                longest = Math.max(longest, j - i + 1);
            }
            return longest;
        }
    }
    

    Java 3: boolean[256]

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            boolean[] visited = new boolean[256];
            int start = 0, last = 0, max = 0, length = s.length();
            while(last < length) {
                if(!visited[s.charAt(last)]) {
                    visited[s.charAt(last)] = true;
                    max = Math.max(max, last++ - start + 1);
                } else {
                    while(visited[s.charAt(last)])
                        visited[s.charAt(start++)] = false;
                    visited[s.charAt(last++)] = true;
                }
            }
            return max;
        }
    }
    

    Java 4: int[256]

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            int[] m = new int[256];
            Arrays.fill(m, -1);
            int res = 0, left = -1;
            for (int i = 0; i < s.length(); ++i) {
                left = Math.max(left, m[s.charAt(i)]);
                m[s.charAt(i)] = i;
                res = Math.max(res, i - left);
            }
            return res;
        }
    }
    

    Python:

    class Solution2(object):
        def lengthOfLongestSubstring(self, s):
            a={}
            count=0
            first=-1
            for i in range(len(s)):
                if s[i] in a and a[s[i]]>first:
                    first=a[s[i]]
                a[s[i]]=i
                count=max(count,(i-first))
            return count
    

    Python:

    class Solution(object):
        def lengthOfLongestSubstring(self, s):
            a=[-1]*256
            count=0
            first=-1
            for i in range(len(s)):
                if a[ord(s[i])]>first:
                    first=a[ord(s[i])]
                a[ord(s[i])]=i
                count=max(count,(i-first))
            return count
    

    Python:

    class Solution:
        def lengthOfLongestSubstring(self, s):
            longest, start, visited = 0, 0, [False for _ in xrange(256)]
            for i, char in enumerate(s):
                if visited[ord(char)]:
                    while char != s[start]:
                        visited[ord(s[start])] = False
                        start += 1
                    start += 1
                else:
                    visited[ord(char)] = True
                longest = max(longest, i - start + 1)
            return longest
    

    Python: wo

    class Solution():
        def longestSubstring(self, s):
            longest, lookup = 0, {}
            for k, v in enumerate(s):
                if v not in lookup:
                    lookup[v] = k
                    longest = max(longest, len(lookup))
                else:
                    for j in range(lookup[v], k):
                        lookup.pop(s[j])
    
            return longest  

    Python: wo

    class Solution(object):
        def lengthOfLongestSubstring(self, s):
            """
            :type s: str
            :rtype: int
            """
            start, mx, m = 0, 0, {}
            for i in xrange(len(s)):
                if s[i] in m and m[s[i]] >= start:
                    start = m[s[i]] + 1
                m[s[i]] = i           
                mx = max(mx, i - start + 1)
               
            return mx 

    C++:

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            int m[256] = {0}, res = 0, left = 0;
            for (int i = 0; i < s.size(); ++i) {
                if (m[s[i]] == 0 || m[s[i]] < left) {
                    res = max(res, i - left + 1);
                } else {
                    left = m[s[i]];
                }
                m[s[i]] = i + 1;
            }
            return res;
        }
    }; 

    C++:

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            vector<int> m(256, -1);
            int res = 0, left = -1;
            for (int i = 0; i < s.size(); ++i) {
                left = max(left, m[s[i]]);
                m[s[i]] = i;
                res = max(res, i - left);
            }
            return res;
        }
    };
    

        

    类似题目:

    [LeetCode] 76. Minimum Window Substring 最小窗口子串

    [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串

    [LeetCode] 340. Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串

    [LeetCode] 727. Minimum Window Subsequence 最小窗口子序列  

    All LeetCode Questions List 题目汇总

     

  • 相关阅读:
    第十二章类的无参方法
    第十三章人机猜拳
    第十一章类和对象
    面向对象七大原则。
    深入类的方法。
    使用集合组织相关数据。
    .NET框架
    C#数据类型
    错误。
    实现Windows的数据绑定
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8477439.html
Copyright © 2011-2022 走看看