题目
字符串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(" "