目录

裴先生
裴先生
发布于 2022-04-10 / 4 阅读
0
0

算法题:最长子字符串的长度

原创

题目描述

给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。

题目要求

  • 输入:是一串小写字母组成的字符串
  • 输出:是一个整数

示例

示例1

  • 输入:‘alolobo’
  • 输出:6
  • 说明:最长子字符串之一是 “alolob”,它包含’o’ 2个。

示例2

  • 输入:‘looxdolx’
  • 输出:7
  • 说明:最长子字符串是 “oxdolxl”,由于是首尾连接在一起的,所以最后一个 ‘x’ 和开头的 ‘l’是连接在一起的,此字符串包含 2 个’o’ 。

示例3

  • 输入:‘bcbcbc’
  • 输出:6
  • 说明:这个示例中,字符串 “bcbcbc” 本身就是最长的,因为 ‘o’ 都出现了 0 次。

备注

  • 1 <= s.length <= 5 x 10^5
  • s 只包含小写英文字母

解题思路

  1. 统计整个字符串中字符 'o' 出现的总次数。
  2. 如果 'o' 的总次数为偶数,那么整个字符串本身就是满足条件的最长子字符串,其长度即为答案。
  3. 如果 'o' 的总次数为奇数,由于字符串是环形的,我们总可以找到一个长度为 len - 1 的子字符串,其中 'o' 的出现次数为偶数(即总次数减一)。这将是可能的最长长度。

优化后的Java解法

import java.util.Scanner;

/**
 * 计算环形字符串中包含偶数个'o'的最长子串长度
 * @since 2026-04
 */
public class LongestSubString {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        if (in.hasNextLine()) {
            String input = in.nextLine();
            solve(input);
        }
        in.close();
    }

    /**
     * 核心解题方法
     * @param s 输入的字符串
     */
    public static void solve(String s) {
        int len = s.length();
        int countO = 0;
        
        // 统计字符 'o' 的总出现次数
        for (int i = 0; i < len; i++) {
            if (s.charAt(i) == 'o') {
                countO++;
            }
        }

        // 根据 'o' 出现次数的奇偶性判断最长子串长度
        if (countO % 2 == 0) {
            System.out.println(len);
        } else {
            System.out.println(len - 1);
        }
    }
}

原创

版权声明:本博客原创文章,由 裴先生 2022年04月10日 发表。
转载说明:除特殊说明外本站文章皆由 CC BY-NC-SA 4.0 协议发布,转载须注明出处。


评论