首页 > 试题广场 >

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

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

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

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


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

输入

nowcoder

输出

2
示例2

输入

nooooow

输出

6
package main

import (
    "fmt"
    "os"
    "bufio"
)

var in=bufio.NewReader(os.Stdin)

func main() {
    var s string
    fmt.Fscan(in,&s)
    max:=0
    cnt:=map[byte]int{}
    for l,r:=0,0;r<len(s);r++{
        cnt[s[r]]++
        for len(cnt)>2{
            cnt[s[l]]--
            if cnt[s[l]]==0{
                delete(cnt, s[l])
            }
            l++
        }
        if r-l+1>max{
            max=r-l+1
        }
    }
    fmt.Println(max)
}

发表于 2023-03-29 09:26:20 回复(0)
做动态规划已经ptst,请加上'连续'二字
发表于 2022-11-18 18:16:55 回复(1)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        HashMap<Character, Integer> map = new HashMap<>();
        
        String s = in.next();
        int n = s.length();

        int left = 0, right = 0;
        int max_len = 2;
        
        while (right < n) {
            if (map.size() < 3) {
                map.put(s.charAt(right), right ++ );
            }
            if (map.size() == 3) {
                int led_idx = Collections.min(map.values());
                map.remove(s.charAt(led_idx));
                left = led_idx + 1;
            }
            max_len = Math.max(max_len, right - left);
        }
        System.out.println(max_len);
    }
}

发表于 2022-07-08 16:11:09 回复(0)
# -*- 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)