求满足条件的最长子串的长度 - 华为OD统一考试(D卷)
OD统一考试(D卷)
分值: 200分
题解: Java / Python / C++
题目描述
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子的长度,字符串本身是其最长的子串,子串要求:
- 只包含1个字母(az,AZ),其余必须是数字;
- 字母可以在子串中的任意位置;
如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。
输入描述
字符串(只包含字母和数字)
输出描述
子串的长度
示例1
输入:
abC124ACb
输出:
4
说明:
满足条件的最长子串是C124或者124A,长度都是4
示例2
输入:
a5
输出:
2
说明:
字符串目身就是满足条件的子串,长度为2
示例3
输入:
aBB9
输出:
2
说明:
满足条件的子串为B9,长度为2
示例4
输入:
abcdef
输出:
-1
说明:
没有满足要求的子串,返回-1
题解
题目类型: 这道题属于字符串处理的问题,需要通过正则表达式或其他方法找到符合要求的子串。
解题思路:
- 定义一个正则表达式模式,用于匹配包含至少一个字母且之间可能包含数字的字符串。
- 使用该正则表达式模式在输入的字符串中查找所有匹配项。
- 对每个匹配项计算其长度,并找到最大的长度。
代码描述:
- Java代码使用了Scanner来读取用户输入的字符串,然后使用正则表达式在字符串中查找符合要求的子串,最后输出最大子串的长度。
- Python代码直接使用re模块来处理正则表达式匹配,逻辑与Java代码类似,最后输出最大子串的长度。
- 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表示程序正常结束
}
#面经##春招##秋招##校招##华为#希望这个专栏不仅能帮您成功通过华为机试,还能让您熟练掌握算法。
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏