OD_2024_C卷_100分_47、求满足条件的最长子串的长度【JAVA】【滑动窗口】

题目描述

给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:

1、 只包含1个字母(a~z, A~Z),其余必须是数字;

2、 字母可以在子串中的任意位置;

如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。

输入描述

复制代码
字符串(只包含字母和数字)

输出描述

复制代码
子串的长度

用例1

输入
复制代码
abC124ACb
输出
复制代码
4
说明
复制代码
满足条件的最长子串是C124或者124A,长度都是4

用例2

输入
复制代码
a5
输出
复制代码
2
说明
复制代码
字符串自身就是满足条件的子串,长度为2

用例3

输入
复制代码
aBB9
输出
复制代码
2
说明
复制代码
满足条件的子串为B9,长度为2

用例4

输入
复制代码
abcdef
输出
复制代码
-1
说明
复制代码
没有满足要求的子串,返回-1
java 复制代码
package odjava.分100;

import java.util.LinkedList;
import java.util.Scanner;

/**
 * 输入:abC124ACb
 * 输出:4
 * 说明:满足条件的最长子串是C124或者124A,长度都是4
 */
public class 求满足条件的最长子串的长度_47 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(getResult(str));
    }

    // 获取满足条件的最长子串的长度
    private static int getResult(String str) {
        // 初始化最长子串长度为-1,表示初始时没有满足条件的子串
        int maxLen = -1;
        // 记录字符串中是否包含字母
        boolean hasLetter = false;

        // 初始化左右指针和存储字母位置的链表
        int left = 0, right = 0;
        LinkedList<Integer> letterIdx = new LinkedList<>();

        // 遍历字符串
        while (right < str.length()) {
            // 获取当前字符
            char c = str.charAt(right);

            // 判断当前字符是否是字母
            if (isLetter(c)) {
                // 若是字母,将 hasLetter 置为 true,表示字符串包含字母
                hasLetter = true;
                // 将字母位置添加到链表中
                letterIdx.add(right);

                // 如果链表中有多个字母位置,则移动左指针至下一个字母位置的下一个字符处
                if (letterIdx.size() > 1) {
                    left = letterIdx.removeFirst() + 1;
                }

                // 如果左指针和右指针相等,说明当前字符即为字母
                // 则右指针右移一位,并继续下一轮循环
                if (right == left) {
                    right++;
                    continue;
                }
            }

            // 更新最长子串长度为当前子串的长度和当前最长子串长度的较大值
            maxLen = Math.max(maxLen, right - left + 1);
            // 右指针右移一位
            right++;
        }

        // 如果字符串中不包含字母,则返回-1
        if (!hasLetter){
            return -1;
        }
        // 否则返回最长子串长度
        return maxLen;
    }

    // 判断字符是否是字母
    public static boolean isLetter(char c) {
        return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
    }
}
相关推荐
The Future is mine41 分钟前
Python计算经纬度两点之间距离
开发语言·python
Enti7c41 分钟前
HTML5和CSS3的一些特性
开发语言·css3
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
爱吃巧克力的程序媛1 小时前
在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
开发语言·qt
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯1 小时前
算法日常记录
java·算法·leetcode
独好紫罗兰2 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿