一、题目描述
给定一个字符串 s ,找出这样一个子串:
- 该子串中的任意一个字符最多出现2次;
- 该子串不包含指定某个字符;
请你找出满足该条件的最长子串的长度。
二、输入描述
第一行为要求不包含的指定字符,为单个字符,取值范围[0-9a-zA-Z]。
第二行为字符串s,每个字符范围[0-9a-zA-Z],长度范围[1,10000]。
三、输出描述
一个整数,满足条件的最长子串的长度;如果不存在满足条件的子串,则返回0。
四、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 第一行为要求不包含的指定字符,为单个字符,取值范围[0-9a-zA-Z]。
char c = sc.nextLine().charAt(0);
// 第二行为字符串s,每个字符范围[0-9a-zA-Z],长度范围[1,10000]。
String line = sc.nextLine();
int left = 0;
int max = 0;
Map<Character, Integer> map = new HashMap<Character, Integer>();
// 遍历第二行字符串的每个字符
for (int i = 0; i < line.length(); i++) {
char ch = line.charAt(i);
// 该子串不包含指定某个字符
if (ch == c) {
map.clear();
left = i + 1;
continue;
}
map.put(ch, map.getOrDefault(ch, 0) + 1);
// 该子串中的任意一个字符最多出现2次
while (map.get(ch) == 3) {
char threeC = line.charAt(left);
left++;
map.put(threeC, map.get(threeC) - 1);
}
// 满足该条件的最长子串的长度
max = Math.max(max, i - left + 1);
}
System.out.println(max);
}
五、效果展示
1、输入
a
nezhastudyjava
2、输出
6
🏆下一篇:华为OD机试真题 Java 实现【投篮大赛】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。