给定一个长度为 n 的字符串,找出最多包含两种字符的最长子串 t ,返回这个最长的长度。
数据范围: ,字符串种仅包含小写英文字母
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) }
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); } }
# -*- 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