首页 > 试题广场 >

包含不超过两种字符的最长子串

[编程题]包含不超过两种字符的最长子串
  • 热度指数:889 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的字符串,找出最多包含两种字符的最长子串 t ,返回这个最长的长度。

数据范围: ,字符串种仅包含小写英文字母

输入描述:
仅一行,输入一个仅包含小写英文字母的字符串


输出描述:
输出最长子串的长度
示例1

输入

nowcoder

输出

2
示例2

输入

nooooow

输出

6
# -*- coding: utf-8 -*-

import sys, collections

class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/90d6a362fa7d4c519d557da797bb02ce?tpId=196&tqId=40552&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3FjudgeStatus%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=3&tags=&title=
        给定一个长度为 n 的字符串,找出最多包含两种字符的最长子串 t ,返回这个最长的长度。
        用例1:
            输入:nowcoder
            输出:2
        用例2:
            输入:nooooow
            输出:6
    算法:
        这里我们通过双指针i, j:i指向当前字符区间的起点,j指向当前字符区间的终点,如果s[i: j + 1]中包含的字符种类,小于等于2,j右移;否则,i右移,直到区间内的字符种类重新小于等于2。在移动区间的时候,我们使用字典count,统计当前区间内字符出现次数。使用maxLen,更新满足条件的字符串的长度。
    复杂度:
        时间复杂度:O(n)
        空间复杂度:O(1)
    """

    def solve(self, s):
        n = len(s)

        i, j, count, maxLen = 0, 0, collections.defaultdict(int), 2
        while j < n:
            count[s[j]] += 1
            while len(count) > 2:
                count[s[i]] -= 1
                if count[s[i]] == 0:
                    count.pop(s[i])
                i += 1
            maxLen = max(maxLen, j - i + 1)
            j += 1
        return maxLen

if __name__ == "__main__":
    sol = Solution()

    s = sys.stdin.readline().strip() # 输入字符串,去除首尾空格

    res = sol.solve(s)

    print res

发表于 2022-07-08 09:50:49 回复(0)