华为OD机试真题 - 最长子字符串的长度

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String inputString = scanner.nextLine();
        System.out.println(findLongestSubstringWithoutRepetition(inputString));
    }

    /**
     * 计算输入字符串中不包含重复字符的最长子串的长度。
     * 使用位运算和链表数组来跟踪每个状态(字符组合)下的最早出现位置。
     *
     * @param input 输入字符串
     * @return 不包含重复字符的最长子串的长度
     */
    public static int findLongestSubstringWithoutRepetition(String input) {
        int status = 0; // 使用位运算表示当前字符组合的状态
        LinkedList<Integer>[] positionMap = new LinkedList[8]; // 映射每个状态到最早出现位置的链表
        for (int i = 0; i < 8; i++) {
            positionMap[i] = new LinkedList<>();
        }
        positionMap[0].add(-1); // 初始化空状态的位置为-1
        int maxLength = 0; // 记录最长子串的长度

        for (int i = 0; i < input.length() * 2; i++) {
            char c = input.charAt(i % input.length()); // 循环输入字符串以处理重叠子串
            switch (c) {
                case 'l':
                    status ^= 4; // 对应0b100
                    break;
                case 'o':
                    status ^= 2; // 对应0b010
                    break;
                case 'x':
                    status ^= 1; // 对应0b001
                    break;
            }

            if (i < input.length()) {
                positionMap[status].add(i); // 记录当前字符在当前状态下的位置
            }

            // 清理不再可能构成最长子串的状态位置
            while (!positionMap[status].isEmpty()) {
                int earliestPosition = positionMap[status].getFirst();
                if (i - earliestPosition > input.length()) {
                    positionMap[status].removeFirst();
                } else {
                    maxLength = Math.max(maxLength, i - earliestPosition);
                    break;
                }
            }
        }

        return maxLength;
    }
全部评论

相关推荐

现在是2026.2.27,距离我2025.8.16在boss上投出第一份简历以来已经过去了半年多时间了。可能许多牛友对我并不陌生,在去年的89月份,深陷实习焦虑的我不停的在牛客上发帖求助,改过的简历不知道发了多少次。因为双非本的缘故,在实习这条路上可谓是处处碰壁。boss上四位数的沟通只换来两位数的回复,好不容易约到的面试很多还因为各种原因被挂。最终在9月底遇到了我实习过程中的第一个贵人:美团实习的ld。尽管那是个测开岗,但是没有关注我实际的技术栈,而是用专业的提问让我感受到了前所未有的面试体验,发掘了自己的技术闪光点。最终让我决定放弃了另一家中小厂的后端。他们非常尊重我对开发学习的热情,也给足了我自由发挥的空间,如果不是他们让我深度参与的用例生成项目,我或许连接到后面面试的机会都没有。尽管岗位不是开发,但这个过程中对大厂工作流程的深度参与以及对业务,项目,和技术的思维提升对我后续的开发面试一样提供了巨大的帮助。时代的洪流让我们每个人都被迫卷入其中,错过了互联网的红利时期,无论实习还是秋招都令不同背景的同学倍感压力,尽管如此我们依旧要相信:努力定有回报最后祝各位27的兄弟姐妹们,在暑期实习的面试路上一路披荆斩棘,策马扬鞭,用梦中情司的offer回应自己一直以来不愿放弃的拼搏timeline:2.6一面2.11&nbsp;二面2.12&nbsp;三面&nbsp;当天转hr面2.26&nbsp;hr面,面完云证+录用评估2.27&nbsp;offer
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务