Leetcode Longest Substring Without Repeating Characters Python的失败实现与学习

Python版本自己都写的这么长,虽然对于例子都通过了,但是在leetcode运行的时候还是通不过,主要是因为起初想算法的时候,疏漏了很关键的东西,其起初的思路是:在遍历字符串的时候,遇到重复的字符就截取一个字串,然后计算所得到的子串中长度最大的返回,如果字符串为空的话返回0,如果没有重复的字符返回字符串的长度
自己失败的版本:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        temp = []
        dict = {}
        point = 0
        count1 = 0
        if len(s) == 0:
            return 0
        for char in s:
            point = point + 1
            if char in temp:
                dict[point] = temp
                temp = []
                temp.append(char)
            else:
                temp.append(char)
                count1 = count1 + 1
                if len(s) == count1:
                    return len(s)
        dict[point + 1] = temp
	a = []
        for key in dict:
            print dict[key]
            a.append(len(dict[key]))
        return max(a)

讨论板上比较不错的Java和Python
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;
    }
利用hashmap找到前一个相同字符的位置,那么着这两者之间的距离就是以当前字符结尾的最长substring.比较目前max的大小,看是否需要更新.还要记得更新一下字符的位置,因为会有重复

Python

class Solution:
    # @return an integer
    def lengthOfLongestSubstring(self, s):
        start = maxLength = 0
        usedChar = {}
        
        for i in range(len(s)):
            if s[i] in usedChar and start <= usedChar[s[i]]:
                start = usedChar[s[i]] + 1
            else:
                maxLength = max(maxLength, i - start + 1)

            usedChar[s[i]] = i

        return maxLength


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值