求满足条件的最长子串的长度 - 华为OD统一考试(D卷)

OD统一考试(D卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

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

  1. 只包含1个字母(az,AZ),其余必须是数字;
  2. 字母可以在子串中的任意位置;

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

输入描述

字符串(只包含字母和数字)

输出描述

子串的长度

示例1

输入:
abC124ACb

输出:
4

说明:
满足条件的最长子串是C124或者124A,长度都是4

示例2

输入:
a5

输出:
2

说明:
字符串目身就是满足条件的子串,长度为2

示例3

输入:
aBB9

输出:
2

说明:
满足条件的子串为B9,长度为2

示例4

输入:
abcdef

输出:
-1

说明:
没有满足要求的子串,返回-1

题解

题目类型: 这道题属于字符串处理的问题,需要通过正则表达式或其他方法找到符合要求的子串。

解题思路

  1. 定义一个正则表达式模式,用于匹配包含至少一个字母且之间可能包含数字的字符串。
  2. 使用该正则表达式模式在输入的字符串中查找所有匹配项。
  3. 对每个匹配项计算其长度,并找到最大的长度。

代码描述

  1. Java代码使用了Scanner来读取用户输入的字符串,然后使用正则表达式在字符串中查找符合要求的子串,最后输出最大子串的长度。
  2. Python代码直接使用re模块来处理正则表达式匹配,逻辑与Java代码类似,最后输出最大子串的长度。
  3. C++代码也是通过正则表达式来进行匹配,但使用了regex库,然后在找到所有匹配项中找到最大长度的子串,并输出其长度。

Java

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        // 创建Scanner对象以读取输入
        Scanner scanner = new Scanner(System.in);

        // 从标准输入流中读取一行文本并存储到字符串变量text中,即用户输入的文本
        String text = scanner.nextLine();

        // 定义正则表达式模式,用于匹配包含至少一个字母且之间可能包含数字的字符串
        Pattern pattern = Pattern.compile("\\d*[a-zA-Z]\\d*");
        // 创建Matcher对象用于匹配文本
        Matcher matcher = pattern.matcher(text);

        // 初始化最大长度为-1,若未找到匹配项,则默认有效长度为-1
        int maxLength = -1;
        while (matcher.find()) { // 在文本中查找所有匹配项
            String match = matcher.group(); // 获取当前匹配项的字符串表示
            int length = match.length(); // 计算当前匹配项的长度
            maxLength = Math.max(maxLength, length); // 更新最大长度为当前匹配项的长度和已有最大长度中的较大者
        }

        // 输出有效长度,若最大长度大于1,则输出最大长度,否则输出-1表示找不到满足要求的子串
        System.out.println(maxLength > 1 ? maxLength : -1);
    }
}

Python

import re  # 导入re模块,用于支持正则表达式操作

# 定义正则表达式模式,匹配包含至少一个字母且之间可能包含数字的字符串
pattern = re.compile(r'\d*[a-zA-Z]\d*')

text = input()  # 从标准输入中获取一行文本,存储在text变量中

max_length = 1  # 初始化最大长度为1,如果未找到匹配项,则默认有效长度为-1
result = pattern.findall(text)  # 查找text中符合正则表达式模式的所有匹配项
if result:  # 如果找到了匹配项
    # 使用列表推导式获取所有匹配项的长度,并取最大值
    max_length = max([len(x) for x in result])

# 输出最大长度(如果最大长度大于1),否则输出-1表示找不到满足要求的子串
print(max_length if max_length > 1 else -1)

C++

#include <iostream> // 包含输入输出流库
#include <regex>    // 包含正则表达式库
#include <string>   // 包含字符串库
using namespace std;

int main()
{
    string text;    // 定义存储文本的字符串变量
    getline(cin, text);   // 从标准输入流中获取一行文本,并存储到变量text中,即用户输入的文本

    regex  pattern("\\d*[a-zA-Z]\\d*");    // 定义正则表达式模式,该模式用于匹配包含至少一个字母且之间可能包含数字的字符串
    smatch matches; // 创建用于存储匹配结果的对象

    int max_length = -1; // 初始化最大长度为-1,若未找到匹配项,则默认有效长度为-1
    while (regex_search(text, matches, pattern)) { // 在文本中查找所有匹配项,直到没有匹配项为止
        for (auto match : matches) {    // 遍历每一个匹配项
            int length = match.str().length(); // 计算当前匹配项的长度
            max_length = max(max_length, length); // 更新最大长度为当前匹配项的长度和已有最大长度中的较大者
        }
        text = matches.suffix().str(); // 更新文本为当前匹配项之后的字符串,以便继续搜索下一个匹配项
    }

    cout << (max_length > 1 ? max_length : -1) << endl;   // 输出有效长度,若最大长度大于1,则输出最大长度,否则输出-1表示找不到满足要求的子串

    return 0;   // 返回0表示程序正常结束
}
    

希望这个专栏不仅能帮您成功通过华为机试,还能让您熟练掌握算法。

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##春招##秋招##校招##华为#
全部评论
abC12a43ACb亲测不通过; 考虑贪心策略,结果一定匹配三个正则串:"\\d+[a-zA-Z]\\d+"、"\\d+[a-zA-Z]"、"[a-zA-Z]\\d+"; 匹配三次,找到最长的串即可
1 回复 分享
发布于 2024-05-30 11:55 广东
快慢指针也可以解决
1 回复 分享
发布于 2024-05-27 23:23 浙江

相关推荐

06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
评论
5
6
分享

创作者周榜

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