字母交换

该博客讨论了一种字符串操作问题,其中可以交换任意两个相邻字母最多m次。目标是找出在这些交换后,字符串中最多能有多少个连续相同的字母。博主通过记录每个字母的下标,使用滑窗算法计算移动代价,优先考虑使两侧元素向中间移动,以求得最佳结果。
摘要由CSDN通过智能技术生成

题目

字符串S由小写字母构成,长度为n。定义一种操作,每次都可以挑选字符串中任意的两个相邻字母进行交换。询问在至多交换m次之后,字符串中最多有多少个连续的位置上的字母相同?链接

思路

  • 记录每个字母出现的下标。对每一个字母出现的所有位置,进行滑窗计算移动代价。
  • 窗口从一个元素开始扩大,计算代价超过要求,缩小窗口,否则扩大窗口。
  • 由经验可得,要把滑窗内所有位置移动到连续位置,两边元素靠中间元素移动的代价较小。

比如字母a的所有下标情况[11,13,15,17,19|21,23,25,30,31],选取中间靠左的(19, 选中间的任意都行)需要分别计算左右移动到中间元素的代价是多少.
左边移动为[15,16,17,18,19]计算得到代价10,右边移动为[19,20,21,22,23,24]代价为21
判断代价是否超过要求。不超过要求更新结果。
循环所有的字母情况。

import java.util.*;


public class Main {
   

   static Map<Character, List<Integer>> map = new HashMap<>();
   //每个字母出现的下标前缀和,计算代价时就不用再遍历
   static Map<Character, List<Integer>> mapPreSum = new HashMap<>();

   public static void main(String[] args) {
   
      Scanner sc = new Scanner(System.in);
      String s = sc.nextLine();
      String[] split = s.split(" "
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值