华为OD刷题C卷 - 每日刷题 17(字符串序列判定,最长的指定瑕疵度的元音子串)

本文主要是介绍华为OD刷题C卷 - 每日刷题 17(字符串序列判定,最长的指定瑕疵度的元音子串),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、(字符串序列判定):

这段代码是解决“字符串序列判定”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于判断字符串S是否是字符串L的有效子串。

main方法首先读取两个字符串SL,然后调用getResult方法并打印最后一个有效字符在L中的位置。

getResult方法使用双指针技术,初始化两个指针ij分别遍历字符串SL。如果两个指针所指向的字符相同,则两个指针都向前移动;如果不同,则只有j指针向前移动。这样,ans变量记录了S中最后一个字符在L中的索引位置。如果S中的所有字符在L中都未找到,则返回-1

2、(最长的指定瑕疵度的元音子串):

这段代码是解决“最长的指定瑕疵度的元音子串”的问题。它提供了一个Java类Main,其中包含main方法和getMaxVowel方法,以及一个辅助方法getFlaw,用于找出给定字符串中最长的、具有指定瑕疵度的元音子串。

main方法首先读取预期的瑕疵度flaw和字符串str,然后调用getMaxVowel方法并打印最长元音子串的长度。

getMaxVowel方法使用双指针技术,通过两层循环遍历字符串str的所有可能子串。使用正则表达式Pattern来检查子串是否为元音字符串,即开头和结尾都是元音字母。同时,使用getFlaw方法来计算子串的瑕疵度。如果找到满足条件的子串,则返回其长度;如果没有找到,则返回0

getFlaw方法通过替换掉所有元音字母,计算剩余非元音字母的长度,即为瑕疵度。

3、(最长的指定瑕疵度的元音子串 - 优化版):

这段代码是第二段代码的优化版本,它提供了一个Java类Simple,其中包含main方法和getMaxVowel方法,用于更高效地找出给定字符串中最长的、具有指定瑕疵度的元音子串。

main方法的实现与第二段代码相同。

getMaxVowel方法首先将所有元音字母存储在一个HashSet中,然后遍历字符串str,记录所有元音字母的索引。接着,使用双指针技术,通过维护一个滑动窗口来找出满足瑕疵度条件的最长元音子串。与第二段代码相比,这种方法减少了不必要的子串检查,提高了效率。

package OD258;import java.util.Scanner;/*** @description 字符串序列判定* @level 6* @score 100*//*** 题目描述* 输入两个字符串S和L,都只包含英文小写字母。S长度<=100,L长度<=500,000。* <p>* 判定S是否是L的有效子串。* <p>* 判定规则:* <p>* S中的每个字符在L中都能找到(可以不连续),且S在L中字符的前后顺序与S中顺序要保持一致。* <p>* (例如,S=”ace”是L=”abcde”的一个子序列且有效字符是a、c、e,而”aec”不是有效子序列,且有效字符只有a、e)* <p>* 输入描述* 输入两个字符串S和L,都只包含英文小写字母。S长度<=100,L长度<=500,000。* <p>* 先输入S,再输入L,每个字符串占一行。* <p>* 输出描述* S串最后一个有效字符在L中的位置。(首位从0开始计算,无有效字符返回-1)*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//字符串sString s = sc.nextLine();//字符串lString l = sc.nextLine();System.out.println(getResult(s, l));}//返回字符串s最后一个有效字符在字符串l中的下标public static int getResult(String s, String l) {char[] ss = s.toCharArray();char[] ls = l.toCharArray();//双指针int ans = -1;int i = 0;int j = 0;while (i < ss.length && j < ls.length) {//如果相同,则i++ j++if (ss[i] == ls[j]) {ans = j;i++;j++;} else {j++;}}return ans;}}
package OD265;import java.util.Scanner;
import java.util.regex.Pattern;/*** @description 最长的指定瑕疵度的元音子串* @level 6* @score 100*//*** 题目描述* 开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如:* <p>* “a” 、 “aa”是元音字符串,其瑕疵度都为0* “aiur”不是元音字符串(结尾不是元音字符)* “abira”是元音字符串,其瑕疵度为2* 给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。* <p>* 子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。* <p>* 输入描述* 首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。* <p>* 接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。* <p>* 输出描述* 输出为一个整数,代表满足条件的元音字符子串的长度。*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//预期瑕疵度int n = Integer.parseInt(sc.nextLine());//字符串String str = sc.nextLine();System.out.println(getMaxVowel(str, n));}//寻找一个字符串中满足预期瑕疵度的最长元音子串,返回最长元音子串的长度public static int getMaxVowel(String s, int flaw) {//如果长度为1if (s.length() == 1) {if (s.charAt(0) == 'a' || s.charAt(0) == 'e' || s.charAt(0) == 'i' || s.charAt(0) == 'o' || s.charAt(0) == 'u' && getFlaw(s) == flaw) {return 1;} else {return 0;}}//双指针Pattern p = Pattern.compile("^[AEIOUaeiou].*[AEIOUaeiou]$");for (int i = 0; i < s.length(); i++) {for (int j = s.length(); j > i; j--) {String temp = s.substring(i, j);//一找到就返回,一定是最大长度if (p.matcher(temp).find() && getFlaw(temp) == flaw) {return temp.length();}}}//没找到的话return 0;}//返回一个元音字符串中的瑕疵度public static long getFlaw(String s) {//开头和末尾一定是元音String newStr = s.replaceAll("[AEIOUaeiou]", "");return newStr.length();}
}
package OD265;import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Pattern;/*** @description 最长的指定瑕疵度的元音子串* @level 6* @score 100*//*** 题目描述* 开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如:* <p>* “a” 、 “aa”是元音字符串,其瑕疵度都为0* “aiur”不是元音字符串(结尾不是元音字符)* “abira”是元音字符串,其瑕疵度为2* 给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。* <p>* 子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。* <p>* 输入描述* 首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。* <p>* 接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。* <p>* 输出描述* 输出为一个整数,代表满足条件的元音字符子串的长度。*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Simple {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//预期瑕疵度long n = Integer.parseInt(sc.nextLine());//字符串String str = sc.nextLine();System.out.println(getMaxVowel(str, n));}//寻找一个字符串中满足预期瑕疵度的最长元音子串,返回最长元音子串的长度public static long getMaxVowel(String s, long flaw) {//所有元音字母char[] vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};//添加到set中Set<Character> vowelSet = new HashSet<>();for (char c : vowels) {vowelSet.add(c);}//存放字符串s中元音字符的下标ArrayList<Integer> vowelIndex = new ArrayList<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);//如果set中含有c,则记录该元音字母的下标if (vowelSet.contains(c)) {vowelIndex.add(i);}}//保存瑕疵度相同的最长元音子串长度int maxLen = 0;int n = vowelIndex.size();//双指针int left = 0;int right = 0;while (right < n) {//瑕疵度 后一个元音字母在s中的下标-前一个元音字母在s中的下标 - left与right中间的元音字母数量int diff = vowelIndex.get(right) - vowelIndex.get(left) - (right - left);//判断瑕疵度if (diff < flaw) {right++;} else if (diff > flaw) {left++;} else {//与预期瑕疵度相等maxLen = Math.max(maxLen, vowelIndex.get(right) - vowelIndex.get(left) + 1);//right++有可能瑕疵度也相等,但长度+1right++;}}return maxLen;}}

这篇关于华为OD刷题C卷 - 每日刷题 17(字符串序列判定,最长的指定瑕疵度的元音子串)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041941

相关文章

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

2390.从字符串中移除星号

给你一个包含若干星号 * 的字符串 s 。 在一步操作中,你可以: 选中 s 中的一个星号。 移除星号左侧最近的那个非星号字符,并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意: 生成的输入保证总是可以执行题面中描述的操作。 可以证明结果字符串是唯一的。 示例 1: 输入:s = “leet**cod*e” 输出:“lecoe” 解释:从左到右执行移除操作: 距离第 1 个

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

华为---OSPF的DR与BDR(六)

9.6 OSPF的DR与BDR 9.6.1 原理概述 在OSPF的广播类型网络和NBMA类型网络中,如果网络中有n台路由器,若任意两台路由器之间都要建立邻接关系,则需要建立n×(n-1)/2个邻接关系,即当路由器很多时,则需要建立和维护的邻接关系就很多,两两之间需要发送的报文也就很多,这会造成很多内容重复的报文在网络中传递,浪费了设备的带宽资源。因此在广播和NBMA类型网络中,OSPF协议定义

剑指offer(C++)--左旋转字符串

题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! class Solution {public:string LeftRotateStri

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了,难不成是被华为淘汰的?在华为混不下去了吧?身体没啥毛病吧,我们这体检可是很严的。” 近日,一位华为员工在朋友圈爆料,自己在面试时遭到了面试官的无理取闹和人身攻击,原因仅仅是因为他35岁了,曾经在华为工作过。 这番话,充满了傲慢与偏见,让人听了义愤填膺。这位面试官的言行,不仅是对求职者的不尊重,更是对职场规则的践踏。 面试本应是双向选择的过程,企业和求职者在相互了解的基

js小题:通过字符串执行同名变量怎么做

在JavaScript中,你不能直接使用一个字符串来直接引用一个变量,因为JavaScript是一种静态类型语言(尽管它的类型在运行时可以变化),变量的名字在编译时就被确定了。但是,有几种方法可以实现类似的功能: 使用对象(或Map)来存储变量: 你可以使用一个对象来存储你的变量,然后使用字符串作为键来访问这些变量。 let myVars = { 'var1': 'Hello', 'var