最长无重复字符的子串

原创 2016年05月31日 09:51:19

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

样例:例如,在"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

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

字符串中相同且长度最长的字符串

题目出自:《程序员面试宝典》(第三版) P226页  面试例题2        输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及首字符的位置。例如“yyabcdabjcabceg”,输...
  • hehao5
  • hehao5
  • 2013-03-19 04:29
  • 1245

求两个字符串的最长公共子串

问题:有两个字符串str和str2,求出两个字符串中最长公共子串

给定一个字符串,求出其最长的重复子串的长度

题目来源:这是编程珠玑上的一道题目概念字符串的前缀和后缀例如字符串 s =“abcdeabc” 则s的前缀: “a”,“ab”,“abc”,“abcd”,“abcde”,“abcdea”,“abc...

求给定字符串的最长回文子串

问题描述:求给定字符串的最长回文子串,比如输入字符串 "google”,该字符串的回文子串有"oo"和”goog",因此输出“goog"。 解决思路:反转字符串后求反转的字符串与原字符串的最长公共子串...
  • wfree
  • wfree
  • 2015-03-28 22:32
  • 561

求某一字符串的最长重复子串

要求:给定一个字符串,求该字符串的最长重复子串,最长重复子串是指在一个主串中,重复子串中最长的那一个,如:abcdefadef 则答案为:def。 预备知识:要解决此题,要用到后缀数组(用指针数组来...
  • htq__
  • htq__
  • 2016-03-11 14:24
  • 854

面试题35:寻找一个字符串中最长的重复子串

思路: 1. 用字符串指针数组保存用户输入的字符串的所有后缀字符串; 2. 将后缀字符串集合进行排序; 3. 比较相邻字符串的公共子串长度,找到长度最大值,保存相应字符串即为所求 代码如下: #inc...

【每日面试题】给定一个字符串,求出其最长的重复子串

题目:给定一个字符串,求出其最长的重复子串 如字符串abcdabcabcd,求的最长重复子串为abcd 代码: void LongChar(char* str) {  if(str==NUL...
  • qunqin
  • qunqin
  • 2012-03-02 14:42
  • 6405

最长不重复子串的长度&最长重复子串

求给定的某一个字符串中的最长不重复子串的长度。 例如字符串s为:“abcdefgegcsgcasse”,其最长的不重复子串为“abcdefg”,长度为7 最长不重复子串的解法一: ...

字符串12:最长无重复字符子串练习题

字符串12:最长无重复字符子串练习题

数据结构与算法分析笔记与总结(java实现)--字符串12:最长无重复字符子串练习题

数据结构与算法分析笔记与总结(java实现)--字符串12:最长无重复字符子串练习题
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)