[Leetcode] 3. Longest Substring Without Repeating Characters

Problem:

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

Examples:
Given “abcabcbb”, the answer is “abc”, which the length is 3.
Given “bbbbb”, the answer is “b”, with the length of 1.
Given “pwwkew”, 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. 用两个指针i,j指向substring的两端,如果j指针指向的字符与substring中字符有重复,则i指针右移【情况1】;如果j指针指向的字符与substring中字符没重复,则j指针右移【情况2】。
- 改进:当【情况1】时,记录下substring中重复字符的下标k,则i直接移到k处。
2. 与方法1相似,利用集合set中元素不重复的原理,把substring放入set中。如遇重复元素,则把set[i]去除;如没有重复元素,则向set中加入j元素。

Solution:

# -*- coding: utf-8 -*-
"""
Created on Wed Jan 11 10:56:01 2017

@author: liangsht
"""
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        #:type s: str
        #:rtype: int
        maxLen = 0 if len(s) == 0 else 1
        i = 0
        j = 0
        aset = set()
        # count is used for counting times of looping
        count = 0
        while i < len(s) and j < len(s):
                count = count + 1
                if s[j] in aset:
                    aset.remove(s[i])
                    i = i+1
                else:
                    aset.add(s[j])
                    j = j+1
                    maxLen = maxLen if j-i < maxLen else j-i
        print count,"loops"
        return maxLen

使用cProfile评测程序运行速度:

import cProfile
s = raw_input("input a string: ") 
solution = Solution()
print solution.lengthOfLongestSubstring(s)

cProfile.run("solution.lengthOfLongestSubstring(s)")
cProfile.run("solution.lengthOfLongestSubstring(s)",filename="result.txt",sort="cumulative")

python -m cProfile test.py
python -m cProfile -o result.out test.py
python -m cProfile -o result.out -s cumulative test.py #增加排序方式

ncalls: 表示函数调用的次数
tottime:表示制定函数总的运行时间,除掉函数中调用子函数的运行时间
percall:第一个percall,等于tottime/ncalls
cumtime:表示该函数及其所有子函数的调用运行时间,即函数开始调用到返回的时间
percall:第二个percall,即函数运行一次的平均时间,等于cumtime/ncalls

ref:
Question in stackoverflow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值