头条2018替换'a'或'b'
首先用区间动态规划的思想
dp[i][j] 第i位开始的长度为j的串修改所需要的次数
for(char c='a';c<'c';c++) { int temp=1; int[][] dp=new int[n+1][n+1];//表示全部修改成一种字母所需要的次数 for(int i=0;i<n;i++) dp[i][1] = str.charAt(i)==c?0:1; for(int len=2;len<=n;len++) { for(int i=0;i+len-1<n;i++) { int r=str.charAt(i+len-1)==c?0:1; int l=str.charAt(i)==c?0:1; dp[i][len]=Math.min(dp[i][len-1]+r, dp[i+1][len-1]+l);//这个地方有点不好理解 if(dp[i][len]<=k) temp=len; } } res=Math.max(res, temp); } System.out.println(res);
采用前缀数组的思想,前缀数组间的差就是修改以后的最大长度
Scanner in = new Scanner(System.in); int n=in.nextInt(),k=in.nextInt(); String str=in.next(); int res=0; for (char c = 'a'; c < 'c'; ++c) { int temp=1; ArrayList<Integer> sums = new ArrayList<>();//记录前缀数组下标 for (int i = 0; i <n ; ++i) { if(str.charAt(i)==c) sums.add(i); } if(sums.size()<=k) temp=n; sums.add(n); for (int i = k+1; i < sums.size(); i++) { temp = Integer.max(temp, sums.get(i) - sums.get(i - k - 1) - 1);//关键代码 } res=Math.max(res,temp); } System.out.println(res);
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/10889369.html

浙公网安备 33010602011771号