首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何找出给定字符串中不含有重复字符的最长子串?

例如,给定字符串str为abcabcbb 不含有重复字符的最长子串为abc 首先分析下 1. 要确定一个字串,就要确定这个子串的起止位置. 2....为确定字串起始位置,最好方式就是使用2个分别代表起止位置的指针. 3. 为判断字符是否重复,还需要一个记录遍历过字符的数据结构,并存储该字符下标,这个数据结构选为HashMap比较合适. 4....遍历字符串,当有字符重复时,移动起始位置指针,从指针位置开始到当前遍历下标位置就是一个新的无重复字符的字串. 5. 重新记录重复元素的下标....这个要查找的最长字串便称作滑动窗口,时间复杂度为O(n),下面用几个图说明下. 1.起始状态,滑动窗口的起始指针start和字符串遍历指针i都指向0; 2.移动指针i,并将遍历过元素记录到HashMap.... 4.遍历结束时,记录下的最大滑动窗口位置就是求得的无重复字符的最长字串.

75610

LeetCode:最长不含重复字符的子字符串

解题思路的思考:   以abcabcbb为例,找出以每个字符结束,不包含重复字符的最长子串。那么其中最长的那个字符串即为答案。...对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串: 以 [a]bcabcbb 结束的最长字符串为[a]bcabcbb,长度为1 以 a[b]cabcbb 结束的最长字符串为...[ab]cabcbb,长度为2 以 ab[c]abcbb 结束的最长字符串为[abc]abcbb,长度为3 以 abc[a]bcbb 结束的最长字符串为a[bca]bcbb,长度为3 以 abca[b]...cbb 结束的最长字符串为ab[cab]cbb,长度为3 以 abcab[c]bb 结束的最长字符串为abc[abc]bb,长度为3 以 abcabc[b]b 结束的最长字符串为abcab[cb]b,长度为...,表示:比如abcabcaa 现在到第4个位置也就是a ,li表示上次a出现的位置 li = 1 si: startindex的缩写,表示以i-1位置字符结尾的最长不重复字符串的开始索引(最左索引)

86900
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    计算不含重复字符的最长子串的长度 #算法#

    给出一个字符串,计算没有重复字符的最长子串的长度。...思路 从左向右扫描,如果下一字符在之前没有出现过,则继续下去,直到一个重复字符的出现,计算到这里之前的子串的长度,然后继续从该位置向右扫描,继续寻找是否有更长的符合条件的子串,但是下一子串的开头就必须从刚才那个重复字符出现过的位置的下一位置开始...判断字符是否出现过,可以用一个128位(或256位)的数组num[],字符可以对应ASCII中的0~127,数组相应位置的元素用来标识是否出现过,比如可以用num[‘a’]=1表示其已经出现过。...但是这样会带来问题,就是如何在识别下一个子串时恢复所有字符的状态,还有如何计算子串的长度。 一种方式是数组对应元素记录该字符在子串中的位置,并在每次遇到一个新子串时记录长度,并更新位置。...,若字符最近出现的位置在subStart的右边,说明已经重复。

    42720

    给定一个字符串,找到包含该字符串所有字符的最短子串

    其思路是这样的 首先遍历一次字符串,求出字符串不同字符的数目 为每一个字符保存一个列表,记录该字符在字符串中出现的索引 记录待求字符串的首字母的索引start(初始值为0),结束索引end(初始值为length...-1) 记录可能的待求字符串的首字母的索引值为pStart(初始值为0) 重新遍历字符串,当前索引为index 更新没有遍历的字符的数目,更新当前字符对应的索引列表。...如果pStart处字符对应的列表长度大于1,则从索引列表中移出pStart,并将pStart加1,并重复该过程 如果index处字符是第一次出现,则将剩余字符数目减一 如果剩余字符数目为0时,且子字符串...getShortestSubString(String str) { if (str == null || str.length() <= 1) { return str; } // 记录目标字符串的起始索引...int start = 0, end = str.length() - 1; // 记录目标字符串的开始位置 int pStart = 0; Map<Character

    58810

    不含重复字符的最长子串长度JAVA_字符串回文判断

    大家好,又见面了,我是你们的朋友全栈君。 给你一个二进制字符串 s ,现需要将其转化为一个 交替字符串 。请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1 。...交替字符串 是指:相邻字符之间不存在相等情况的字符串。例如,字符串 “010” 和 “1010” 属于交替字符串,但 “0100” 不是。 任意两个字符都可以进行交换,不必相邻 。...示例 1: 输入:s = "111000" 输出:1 解释:交换位置 1 和 4:"111000" -> "101010" ,字符串变为交替字符串。...示例 2: 输入:s = "010" 输出:0 解释:字符串已经是交替字符串了,不需要交换。...示例 3: 输入:s = "1110" 输出:-1 提示: 1 <= s.length <= 1000 s[i] 的值为 '0' 或 '1' class Solution { public

    53030

    剑指OfferV2(增) -- 最长不含重复字符的子字符串

    Damaer/Coding 文档地址:https://damaer.github.io/Coding/#/ 剑指OfferV1 系列已经完成,补增 V2 题目以及C++语言解法,欢迎关注~ Part1最长不含重复字符的子字符串...1题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。...包含该字符的时候,如果该字符上次出现的位置不在``start之后,那么不用更新start,否则start`需要更新为上次出现该字符的位置。...遍历字符的时候,同时将每个字符以及它出现的索引位置,添加到map里面,计算当前的最长的不包含 重复字符的子字符串长度len,与之前保存的进行对比即可。...s[i]] = i; len = max(len, i - start); } return len; } }; 时间复杂度:遍历一次所有的字符

    36630

    最长不含重复字符的子字符串

    一、题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。...那么我们创建一个head指针,用于指向子字符串中的第一个字符。...由于需要判断子字符串中是否包含了重复的字符,那么我们就需要一个mark变量,它可以是数组或者哈希表的数据结构,用来保存子字符串中出现过的字符和这个字符的最新下标值,此处需要注意的是,如果使用数组,则初始化一个...【如果mark[x] >= head】则表示发生了字符重复。那么当前这个子字符串就结束了。将head指向mark[x]+1的位置,作为全新的子字符串head指针。...这样经过上面的流程遍历完字符串s,最终的result值,就是最长不含重复字符的子字符串。

    23440

    LeetCode-面试题48-最长不含重复字符的子字符串

    # LeetCode-面试题48-最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。...对于acb而言下一个字符r不是重复的字符,其在dp[j-1]之外,所以dp[j] = dp[j-1]+1 当dp[j-1]>=j-i,说明字符在dp[j-1]区间之中,含有重复字符,则dp[j]的左边界由第一次出现的重复字符的位置觉得...同时计算子串的长度,当到达相同的字符时候,自然希望子串的起始位置变成重复的位置。...而下一次子串的长度则=计算下一次碰到重复字符的位置end到上一次碰到重复字符位置start的差 那么如何去知道前面是否有重复的字符?...所以这里采用hash表的方式存储每一个字符最后出现的位置,以便于快速找到上一次start的位置,由于遍历从0开始,所以将start初始化为-1,表示第一个位置长度为1,最后取最大的字串长度 # Java

    28120

    【LeetCode02】找出不含重复字符的 最长子串 的长度

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。...示例 2: 输入: "bbbbb"输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。...示例 3: 输入: "pwwkew"输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。...这道题,一开始最直接的想法就是暴力法,直接穷举所有的子串,然后选择无重复的子串中最长的那个。...图来自网络 下面介绍一种"滑动窗口"的解题思路 1 )定义一个空的集合Lookup(集合的元素是唯一的) 2 )滑动窗口cur_len 一开始的长度为1,并且从字符串s最左端开始向右滑动(滑动N次,N为字符串

    1.6K10

    剑指offer面试题48: 最长不含重复字符的子字符串

    (请从子字符串中找出一个最长的不包含重复字符的子字符串) 首先定义函数f(i)表示以第i个字符结尾的不包含重复字符的子字符串的最大长度。我们从左到右扫描字符串中的每个字符。...如果第i个字符之前在字符串中出现过,那么情况就复杂点,我们先计算第i个字符和它上次出现在字符串中的位置的距离,并记为d,接着就有两种情况。第一种。...d字符出现在了f(i-1)对应的最长字符串中,因此f(i)=d。这种情况是能够保证字符是连续的。...当我们在f(i-1)对应的最长字符串找到了第i个字符的位置索引,就删除f(i-1)对应的字符串下,i字符索引之前的所有字符。...第二种情况,d>f(i-1),此时第i个字符出现在了f(i-1)对应的最长字符串之前,那么依然有f(i)=f(i-1)+1 书上分析如下: 我在leetcode上找到一题最长子序列的 运行结果:

    18730

    2021-11-18:给定一个长度len,表示一共有几位。所有字符

    2021-11-18:给定一个长度len,表示一共有几位。所有字符都是小写(a~z),可以生成长度为1,长度为2,长度为3...长度为len的所有字符串。...如果把所有字符串根据字典序排序,每个字符串都有所在的位置。给定一个字符串str,给定len,请返回str是总序列中的第几个。...第一位c : 以a开头,剩下长度为(0~6)的所有可能性有几个 + 以b开头,剩下长度为(0~6)的所有可能性有几个 + 以c开头,剩下长度为(0)的所有可能性有几个 第二位d : + 以ca开头的情况下...,剩下长度为(0~5)的所有可能性有几个 + 以cb开头的情况下,剩下长度为(0~5)的所有可能性有几个 + 以cc开头的情况下,剩下长度为(0~5)的所有可能性有几个 + 以cd开头的情况下,剩下长度为...(0)的所有可能性有几个 第三位b + 以cda开头的情况下,剩下长度为(0~4)的所有可能性有几个 + 以cdb开头的情况下,剩下长度为(0)的所有可能性有几个。

    28710
    领券