leetcode算法练习【3】 无重复字符的最长子串

题目如下

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

方法:HashMap

  • 就是将字符串当字符数组看,利用HashMap判定是否与之前重复,如果是且value(下标)比start大,则start转移,且计算长度,若是最后一个,则直接计算长度,因为最后一个元素与之前的算法结果差1,所以需要分开计算。
class Solution {
    public int lengthOfLongestSubstring(String s) {

        int start,best_length;
        char[] str = s.toCharArray();
        start = 0;
        best_length = 0;
        HashMap<Character,Integer> map  = new HashMap<>();
        for(int i = 0 ;i<str.length;i++){
            if(map.containsKey(str[i])&&map.get(str[i])>=start){
                //if exists
                if (best_length<i-start){
                    best_length = i - start;
                }
                start = map.get(str[i])+1;
            }
            else if (i==str.length-1){
                if (best_length<i-start+1){
                    best_length = i - start+1;
                }
            }
            map.put(str[i],i);
        }
        return best_length;
    }
}
复杂度分析
  • 时间复杂度:O(n)。
  • 空间复杂度:O(n),需要用到n的数组和<n的hashMap的空间。

评论区Python解法,思路相近

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        st = {}
        i, ans = 0, 0
        for j in range(len(s)):
            if s[j] in st:
                i = max(st[s[j]], i)
            ans = max(ans, j - i + 1)
            st[s[j]] = j + 1
        return ans;
  • 一下是两方法资源用量对比图:可见Java版块,但是耗内存,应当是数组和HashMap的问题,Python就相对慢点,但是好在new数组
    在这里插入图片描述
发布了120 篇原创文章 · 获赞 153 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/symuamua/article/details/105294446