📅  最后修改于: 2023-12-03 15:28:48.914000             🧑  作者: Mango
这是一道来自2010年门户网站编程竞赛的问题8,该竞赛是由门户网站组织的,主要面向中国各个高等院校的计算机专业学生。问题8是一道数据结构算法题,旨在测试参赛选手对于基本数据结构的掌握以及编程实现能力。
有一个长度为N的字符序列,每个字符都是大写字母A, B, C, D。现在有M个操作指令,每个指令包含两个整数l和r。需要你实现以下两个指令:
首先需要求解该序列[l, r]之间一共有多少个不同的子序列。 我们可以用一个set数据结构保存所有的子序列(注意不是子串),然后返回set的size即可。
需要求出该序列中[l, r]之间出现次数排名前4的子序列及它们在[l, r]间出现的次数。这个问题可以用一个map来实现。首先遍历[l,r]之间所有的子序列,用一个int变量存储每个子序列出现的次数。然后遍历map,返回前四个数值最大的key-value对即可。
Set<String> set = new HashSet<>();
for (int i = l; i <= r; i++) {
for (int j = i; j <= r; j++) {
set.add(s.substring(i, j + 1));
}
}
return set.size();
Map<String, Integer> map = new HashMap<>();
for (int i = l; i <= r; i++) {
for (int j = i; j <= r; j++) {
String sub = s.substring(i, j + 1);
if (map.containsKey(sub)) {
map.put(sub, map.get(sub) + 1);
} else {
map.put(sub, 1);
}
}
}
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, (o1, o2) -> (o2.getValue() - o1.getValue()));
List<String> res = new ArrayList<>();
for (int i = 0; i < Math.min(4, list.size()); i++) {
res.add(list.get(i).getKey() + " " + list.get(i).getValue());
}
return res;
以上是Java实现的示例代码,其他语言代码类似。