全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:寻找符合要求的最长子串
知识点双指针
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
给定一个字符串 s ,找出这样一个子串:
1)该子串中的任意一个字符最多出现2次;
2)该子串不包含指定某个字符;
请你找出满足该条件的最长子串的长度。
输入描述:
第一行为要求不包含的指定字符,为单个字符,取值范围[0-9a-zA-Z]
第二行为字符串s,每个字符范围[0-9a-zA-Z],长度范围[1,10000]
输出描述:
一个整数,满足条件的最长子串的长度;如果不存在满足条件的子串,则返回0
示例1
输入:
D
ABC123
输出:
6
示例2
输入:
D
ABACA123D
输出:
7
解题思路:
使用map对象来统计字符出现的次数。
当出现不包含的字符的时候,清空map
当有字符出现次数到达3次的时候(超过2),对map进行遍历,将出现3次的字符以及它之前的字符全部剔除。
代码实现一:
package com.codernav.demo.hwod.exam; import java.util.HashMap; import java.util.Map; import java.util.Scanner; /** * @title 寻找符合要求的最长子串 * @Description 给定一个字符串 s ,找出这样一个子串: * 1)该子串中的任意一个字符最多出现2次; * 2)该子串不包含指定某个字符; * 请你找出满足该条件的最长子串的长度。 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/18 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); char c = sc.nextLine().charAt(0); String s = sc.nextLine(); int left = 0; //子串的起始位置 int max = 0; /** * key:字符 * value:字符出现的次数 */ Map<Character, Integer> map = new HashMap<>(); for (int i = 0; i < s.length(); i++) { char temp = s.charAt(i); if (temp == c) { map.clear(); //指定字符之前的数据需要清空 left = i + 1; //指定字符本身不做计数,所以需要+1 continue; } map.put(temp, map.getOrDefault(temp, 0) + 1); while (map.get(temp) == 3) { //字符出现第二次之前的字符都需要删除 char rmStr = s.charAt(left); left++; map.put(rmStr, map.get(rmStr) - 1); //起始位置后移,字符个数也需要-1 } max = Math.max(max, i - left + 1); } System.out.println(max); } }
代码实现二:Java满分实现
package com.codernav.demo.hwod.exam; import java.util.HashMap; import java.util.Map; import java.util.Scanner; /** * @title 寻找符合要求的最长子串 * @Description 给定一个字符串 s ,找出这样一个子串: * 1)该子串中的任意一个字符最多出现2次; * 2)该子串不包含指定某个字符; * 请你找出满足该条件的最长子串的长度。 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/18 */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); char c = scanner.next().charAt(0); String s = scanner.next(); test(c, s); } private static void test(char c, String s) { int l = 0; int result = 0; Map<Character, Integer> map = new HashMap<>(); for (int i = 0; i < s.length(); i++) { char temp = s.charAt(i); if (temp == c) { map.clear(); l = i + 1; continue; } map.put(temp, map.getOrDefault(temp, 0) + 1); while (map.get(temp) == 3) { char rmStr = s.charAt(l); l++; map.put(rmStr, map.get(rmStr) - 1); } result = Math.max(result, i - l + 1); } System.out.println(result); } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...