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

题目:输入是一个字符串,找出没有重复字符的最长子字符串的长度

示例

“abcabcbb”最长子串(abc)长度为3

“bbbbbbb”最长子串(b)长度为1

“abdevbac”最长子串(bdev)长度4

算法思想

设置两个下标标识,初始时都位于数组的头部,并设置一个HashSet。标识runner先往后走,并将经过的字符放入HashSet中,当存在重复的字符时停止移动;此时,标识walker在后面追,直到walker的字符和runner的字符相同为止,此时walker与runner之间的字符是无重复的字符串,将长度记录为max。进行一遍遍历后可以得到最长字符串的长度值。

时间复杂度

两个标识需要分别遍历一遍,即2*N,故复杂度为:O(n)

代码实现

public int lengthOfLongestSubstring(String s) {

if(s==null || s.length()==0)

return 0;

HashSet<Character> set = new HashSet<Character>();

int max = 0;

int walker = 0;

int runner = 0;

while(runner<s.length())

{

if(set.contains(s.charAt(runner)))

{

while(s.charAt(walker)!=s.charAt(runner))

{

set.remove(s.charAt(walker));

walker++;

}

if(max<runner-walker)

{

max = runner-walker;

}

walker++;

}

else

{

set.add(s.charAt(runner));

}

runner++;

}

max = Math.max(max,runner-walker);

return max;

}

时间: 2024-07-29 10:05:56

【算法】查找字符串中无重复最长子串的长度的相关文章

查找字符串中第一个不重复的字符

import java.util.*; public class GetFirstNoRepeatChar{ static char getChar(String s){ int len=s.length(); int len_tim=128; char c='F'; int []tim=new int[len_tim]; //以字符做下标,存储该字符出现次数 for(int i=0;i<len;i++){ c=s.charAt(i); tim[c]+=1; } //遍历,取得 for(int

【leetcode算法-中等】3. 无重复字符的最长字串

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

字符串中连续出现最多的子串 &amp; 字符串中最长重复子串

字符串中连续出现最多的子串 & 字符串中最长重复子串 字符串中连续出现最多的子串 & 字符串中最长重复子串,这两个问题都可以用后缀数组来表示,至于后缀数组可以参考编程珠玑P156:后缀数组就是定义一个数组指针,分别指向字符串中的对应位置,如下: a b c a b c a b c d e .substr[0] b c a b c a b c d e ....substr[1] c a b c a b c d e .......substr[2] a b c a b c d e ......

萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对"基数"以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了"HyperLogLog",从而引出了Cardinality Estimation算法,以及学习它时参考的一些文章: http://blog.codinglabs.org/articles/algorithms-for-cardinality-estimation-part-i.html 从文章上看来,基数是指一个

查找字符串中最长子串

查找字符串中最长子串,例如“I love OC”最长子串为“love” 1 void findMaxLengthSubstr1(char *src) 2 { 3 char *start = src; 4 char *end = src; 5 unsigned int maxLength = 0; 6 unsigned int tempLength = 0; 7 // 此处子串长度不能超过100 8 char maxStr[100] = "0"; 9 10 if (src == NULL

C语言字符串之无重复字符的最长子串

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

[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

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

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

【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出