最长无重复字符子串

1 题目

Given a string,find the length of the longest substring without repeating characters. Forexample, the longest substring without repeating letters for"abcabcbb" is "abc", which the length is 3. For"bbbbb" the longest substring is "b", with the length of 1.

2 分析

思路一:最简单直接的方法是从字符串的每个字符w出发检测出最长无重复子串的长度,最后取最大值。时间复杂度O(nAve(subStr)),其中n为字符串长度,Ave(subStr)表示从所有位置出发最大子串的长度。

思路二:例如字符串s = “abcdcf”,从字符串的0位置出发,在4时遇到重复字符”c”,按照思路一下一步从位置1出发开始计算。不难发现,从位置1、2出发的子串长度不会大于从0位置出发的子串长度,因此不需要计算从位置1、2出发的最长子串,只需从位置3开始。从位置3开始时,只需回撤位置0、1、2的标志位即可,无需真正从位置3开始。综上字符串每个位置的元素访问2次,因此时间复杂度O(n)。

3 实现

思路二的代码实现如下:

intSolution::lengthOfLongestSubstring(string s)
{
      int maxLen = 0;
      int len = 0;
      int start = 0;
      int isFirst[128] = {-1};
      for (int i = 0; i < 128; ++i)
      {
             isFirst[i] = -1;
      }
      int cur = 0;
      int size = s.length();
      char ch;

      while (cur < size)
      {
             ch = s[cur];
             if (isFirst[ch] > -1)
             {
                    int temp = isFirst[ch];
                    maxLen = max(maxLen, len);
                    len = len - (temp - start +1);
                    while (start <= temp)
                    {
                           isFirst[s[start++]] =-1;
                    }
             }
             isFirst[ch] = cur;
             ++len;
             ++cur;
      }
      maxLen = max(maxLen, len);

      return maxLen;
}

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

时间: 2024-10-09 14:24:35

最长无重复字符子串的相关文章

字符串练习(八):最长无重复字符子串

对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. 测试样例: "aabcb",5 返回:3 public class DistinctSubstring { public int longestSubstring(String A, int n) { // write code here if(A==null || n==0){ return

算法--最长无重复字符子串

转载请标明出处http://www.cnblogs.com/haozhengfei/p/d0906ebc98f7b6eaecb3ecd738dc78ac.html 最长无重复字符子串练习题 最长无重复字符子串练习 第12节 最长无重复字符子串练习题 对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. 测试样例: "aabcb",5 返回:3 J

求字符串的最长无重复字符子串长度

题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wk

Leetcode 3 Longest Substring Without Repeating Characters. (最长无重复字符子串) (滑动窗口, 双指针)

目录 问题描述 例子 方法 Leetcode 3 问题描述 Given a string, find the length of the longest substring without repeating characters. 例子 Example 1: Input: "abcabcbb" Output: 3 Explanation: The answer is "abc", with the length of 3. Example 2: Input: &q

符串的最长无重复字符的子串长度

题目描述: 对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. 测试样例: "abcdbefgdchi",12 返回:8 这个题我研究了好半天,确实不好想,看了别人的思路,半天才把代码写出来 分析: 首先定义三个辅助变量: max_len:表示字符串中最长无重复字符的子串长度,也就是函数返回值 map<char, int>:用来存放

lintcode 中等题:longest substring without repeating characters 最长无重复字符的子串

题目 最长无重复字符的子串给定一个字符串,请找出其中无重复字符的最长子字符串. 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3. 对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1. 解题 利用HashMap,map中不存在就一直加入,存在的时候,找到相同字符的位置,情况map,更改下标 public class Solution { /** * @param s: a s

查找字符串中最长无重复字符的子串

设定一个当前子字符串:tempString 设定一个保持最长无重复子串的数组:list 思路: 从第一个字符开始判断, 如果当前子串不包括当前的字符,则当前子串加入当前的字符成为新的当前子串, 如果当前子串包括当前的字符,判断当前字符在当前字符串中的位置,根据这个位置把字符串分成两个字符串,如果后面一个末尾加当前字符为新的当前子字符串,判断当前子串跟list数组中的子串长度,如果当前子串长,则清空list,把当前子串加入:如果相等,直接将当前子串加入list. 最后list的中的子字符串就是最长

[LeetCode]3. 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 letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest subst

[LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串 C++语言 java语言实现

Given a string, find the length of the longest substring without repeating characters. Example 1: Input: "abcabcbb" Output: 3 Explanation: The answer is "abc", with the length of 3. Example 2: Input: "bbbbb" Output: 1 Explana