牛客网 字节跳动算法题-最长可翻转字符串
描述
有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。
输入描述:
第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。
输出描述:
输出在操作次数不超过 m 的情况下,能够得到的 最大连续 全’a’子串或全’b’子串的长度。
题解:
最长可翻转字符串长度,由于题目只有’a’,b’两种字符字母,我们只需要统计字母’a’的下标,利用前缀和思想,统计满足最大翻转次数的区间长度并判断取最大值。
import java.util.*; public class Main { public static void main(String []args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); String str = scanner.next(); System.out.println(Math.max(helper(n,m,str,a),helper(n,m,str,b))); } public static int helper(int n, int m, String str,char a) { int max = 0; List<Integer> preSum = new ArrayList<>(); //统计字母的下标 for(int i = 0; i < str.length(); i++) { if(str.charAt(i) == a){ preSum.add(i); } } //若变化的字母个数小于最大翻转次数,直接返回字符串长度 if(preSum.size() < m) return n; //需要将字符串长度push到列表中 preSum.add(str.length()); max = preSum.get(m); //统计满足最大翻转次数的区间长度并判断取最大值 for(int i = m+1; i < preSum.size(); i++) { max = Math.max(preSum.get(i) - preSum.get(i-m-1) - 1,max); } return max; } }