关闭

最长无重复字符的子串

标签: 哈希表字符串
800人阅读 评论(0) 收藏 举报
分类:

题目描述:给定一个字符串,请找出其中无重复字符的最长子字符串。

样例:例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3。对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1。

从头开始扫描字符串,通过一个哈希表来记录每个字符以及字符所在的位置,若新扫描的字符不在哈希表中,则继续向前;若在哈希表中(记为cur),则证明此时已经不是无重复字符的子串了,所以,找到这个字符在哈希表中的位置,清空哈希表,从这个位置+1的位置(记为index)开始,再实施同样的操作(当然,其实此时从index到cur没有必要再重新扫描一遍,他一定是无重复字符的),比较每次进行这样的操作生成的哈希表的长度,返回最长的长度。

哈希表很典型的应用,当然,也可以看作是两个指针的应用。

我根据这两种方法,分别给出两段代码:

class Solution:
    # @param s: a string
    # @return: an integer
    def lengthOfLongestSubstring(self, s):
        hash_table = []
        i, n = 0, len(s)
        max_value = 0
        temp = 0
        while i != n:
            if s[i] not in hash_table:
                hash_table.append((s[i], i))
                temp += 1
                i += 1
                max_value = max(max_value, temp)
            else:
                i = hash_table[s[i]] + 1
                temp = 0
                hash_table.clear()
        return max_value
        # write your code here




class Solution:
    # @param s: a string
    # @return: an integer
    def lengthOfLongestSubstring(self, s):
        begin, end, cur = 0, 0, 0
        n = len(s)
        max_len, temp = 0, 0
        while cur < n:
            if s[cur] not in s[begin: end]:
                temp += 1
            else:
                # 寻找重复位的下一位
                # 实际上,这里将s[begin: end]看作是天然的哈希表
                begin = s[begin: end].index(s[cur]) + 1 + begin
                temp = end - begin + 1
            max_len = max(max_len, temp)
            cur += 1
            end += 1
        return max_len
        # write your code here

第一段代码用的是哈希表,思路清晰简单,但是每次查到重复之后,需要从重复位的下一位开始,进行计算,所以可能计算量上不是最佳;第二段用的是两根指针,一次遍历解决问题,但是相对更难写一点。


0
0
查看评论

lintcode,最长无重复字符的子串

给定一个字符串,请找出其中无重复字符的最长子字符串。 样例 例如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3。 对于,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。一刷没有ac 下面链接里面解释的很清楚,可以参考 http://blog...
  • zsjmfy
  • zsjmfy
  • 2016-11-29 21:52
  • 497

LintCode-最长无重复字符的子串

给定一个字符串,请找出其中无重复字符的最长子字符串。 样例 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3。 对于,"bbbbb",其无重复字符的最长子字符串为"b&q...
  • wangyuquanliuli
  • wangyuquanliuli
  • 2015-05-14 19:08
  • 7014

找到字符串的最长无重复字符子串

【题目】 给定一个字符串str,返回str的最长无重复字符子串的长度。 【举例】 str="abcd",返回4 str="aabcb",最长无重复字符子串为"abc",返回3。 【要求】 如果str的长度为N,请实现时间复杂度为...
  • yzllz001
  • yzllz001
  • 2016-10-19 20:57
  • 789

Java实现-最长无重复字符的子串

public class Solution { /** * @param s: a string * @return: an integer */ public int lengthOfLongestSubstring(String s) { ...
  • qq_14927217
  • qq_14927217
  • 2017-06-05 22:27
  • 818

[LintCode 384] 最长无重复字符的子串(Python)

题目描述给定一个字符串,请找出其中无重复字符的最长子字符串。样例 例如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3。 对于,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。思路遍历字符串中的每一个元素。借助一个辅助键值对来存储某个元素最后一次出现...
  • yurenguowang
  • yurenguowang
  • 2017-09-04 17:02
  • 618

求字符串的最长无重复字符子串(C++)

题目:          给定一个字符串str,返回str的最长无重复字符子串的长度。                   如:"abc...
  • u013575812
  • u013575812
  • 2015-12-06 22:20
  • 1093

寻找字符串的最长不重复子串,计算复杂度O(n),两种实现

问题:给定一个字符串,找出这个字符串中最长的不重复子串。 计算负责度:O(n)
  • liyuming0000
  • liyuming0000
  • 2015-07-17 11:57
  • 3876

【算法题】查找字符串中无重复最长子串的长度

题目:输入是一个字符串,找出没有重复字符的最长子字符串的长度 示例: “abcabcbb”最长子串(abc)长度为3   “bbbbbbb”最长子串(b)长度为1 “abdevbac”最长子串(bdev)长度4
  • u010515761
  • u010515761
  • 2015-02-04 15:36
  • 4334

LeetCode | Longest Substring Without Repeating Characters(最长连续不重复子串)

题目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating lette...
  • a45872055555
  • a45872055555
  • 2014-07-04 17:53
  • 1163

最长无重复子串----滑动窗口解法

class Solution { /* * 2018.01.16 * 解题方法:动态规划,但是今天新学了一招:滑动窗口----有点猛 * 定义左右left、right指针,map数组,然后遍历判断 */ public int length...
  • lingluanxingkong
  • lingluanxingkong
  • 2018-01-17 09:23
  • 54
    个人资料
    • 访问:204508次
    • 积分:4095
    • 等级:
    • 排名:第8970名
    • 原创:212篇
    • 转载:0篇
    • 译文:0篇
    • 评论:39条
    博客专栏
    文章分类
    最新评论