给定一字符串,请统计位置连续,且无重复字符出现的子串数量。例如abc是无重复字符的子串,abb不是。 注:内容一样但位置不一样的子串,按不同子串参与统计。 一个字符串中任意个连续的字符组成的子序列称为该字符串的子串。 解答要求 时间限制: C/C++ 1000ms, 其他语言:2000ms 内存限制: C/C++ 256MB, 其他语言:512MB 输入 一个字符串,仅由小写英文字母组成,其长度范围:[1, 1000000] 输出 一个整数,表示统计出的无重复字符的子串的数量。 样例1 复制输入: abac 复制输出: 8 解释: 子串有 a、b、a、c、ab、ba、ac、aba、bac、abac, 无重复字符的子串为 a、b、a、c、ab、ba、ac、bac,因此统计结果为8。 样例2 复制输入: xbmxbnh 复制输出: 21 解释: 无重复字符的子串为 x、b、m、x、b、n、h、xb、bm、mx、xb、bn、nh、xbm、bmx、mxb、xbn、bnh、mxbn、xbnh、mxbnh,因此统计结果为21。
时间: 2023-10-20 10:03:49 浏览: 435
可以使用滑动窗口的思想来解决这个问题。定义两个指针 left 和 right,分别表示无重复字符子串的左右边界,初始值都为 0。然后不断地将 right 向右移动,直到发现第一个重复字符。此时,我们就可以得到一个以 left 为起点,right - 1 为终点的无重复字符子串。接着移动 left,直到刚刚那个重复字符从窗口中去除为止,然后再移动 right,如此往复,直到 right 到达字符串的末尾为止。
在这个过程中,我们使用一个哈希表来维护当前窗口中的所有字符及其出现的次数。具体地,哈希表中的每个键值对,都表示某个字符和其在窗口中出现的次数。每次移动 right 时,我们先将新的字符加入哈希表,然后判断当前窗口是否合法,如果不合法,则移动 left,并将哈希表中相应的字符出现次数减一,直到窗口再次合法为止。
最后,我们统计所有的合法子串的数量,即为所求的答案。
下面是具体的实现代码:
阅读全文