目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Python算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
一、题目描述
给定两个字符串string1和string2。
string1是一个被加扰的字符串。string1由小写英文字母(‘a’-‘z’)和数字字符(‘0’-‘9’)组成,而加扰字符串由’0’-‘9’、‘a’-'f’组成。string1里面可能包含0个或多个加扰子串,剩下可能有0个或多个有效子串,这些有效子串被加扰子串隔开。
string2是一个参考字符串,仅由小写英文字母(‘a’-‘z’)组成。
你需要在string1字符串里找到一个有效子串,这个有效子串要同时满足下面两个条件:
- 这个有效子串里不同字母的数量不超过且最接近于string2里不同字母的数量,即小于或等于string2里不同字母的数量的同时且最大。
- 这个有效子串是满足条件(1)里的所有子串(如果有多个的话)里字典序最大的一个。如果没有找到合适条件的子串的话,请输出"Not Found"
示例:
输入字符串string1为"thisisanewday111forme",输入字符串string2为"good"。string1里有效子串和加扰子串分割后可表示为:“thisis”+“a”+“n”+“e”+“w”+“da”+“y”+“111f”+“orm”+“e”,去除加扰子串(“a”、“e”、“da”、“111f”、“e”)后的有效子串候选为(“thisis”, “n”, “w”, “y”, “orm”)。
输入字符串string2里不同字母的数量为3(‘g’、‘o’、‘d’),从有效子串候选里可以找出"orm"满足要求,其不同字母的数量为3,最接近于string2不同字母的数量。
二、输入描述
输入为两个字符串,第1行是题目里的string1(被加扰的字符串),第2行是题目里的string2(参考字符串)。
三、输出描述
输出为一个字符串(有效字符串)。
四、解题思路
- 第一行输入一个被加扰的字符串(由小写英文字母(‘a’-‘z’)和数字字符(‘0’-‘9’)组成,而加扰字符串由’0’-‘9’、‘a’-'f’组成);
- 第二行输入一个参考字符串;
- 获取有效字符串, 这个有效子串里不同字母的数量不超过且最接近于string2里不同字母的数量;这个有效子串是满足条件(1)里的所有子串(如果有多个的话)里字典序最大的一个;
- 定义一个变量maxDiffCharNum,不同字符个数最接近的字符串长度;
- 定义一个变量maxStr,记录当前最大长度字符串;
- 通过正则表达式"[abcdef0123456789]",将第一行被打扰的字符串分割成有效子串;
- 遍历有效子串;
- 获取不同字符的数量;
- 获取数量最接近的个数;
- 如果有相同长度的有效子串,取字典序最大的一个;
- 输出符合要求的最长有效子串;
五、Python算法源码
# 被加扰的字符串,由小写英文字母('a'-'z')和数字字符('0'-'9')组成,而加扰字符串由'0'-'9'、'a'-'f'组成
string1 = input()
string2 = input()
i = 0
# 获取有效子串
validArr = []
while i < len(string1):
if 'g' <= string1[i] <= 'z':
lt = i
while i < len(string1) - 1 and 'g' <= string1[i+1] <= 'z':
i += 1
if i == len(string1) - 1 and not 'g' <= string1[i-1] <= 'z':
validArr.append(string1[i])
i += 1
validArr.append(string1[lt:i])
else:
i += 1
delta = 10000
length = len(set(string2))
maxStrArr = []
for s in validArr:
cur = length - len(set(s))
if 0 <= cur < delta:
maxStrArr = [s]
delta = cur
elif cur == delta:
maxStrArr.append(s)
else:
continue
maxStrArr.sort()
if not maxStrArr:
print("Not Found")
else:
print(maxStrArr[-1])
六、效果展示
1、输入
nezhalovejava123
java
2、输出
lov
3、说明
将输入字符串1里的加扰子串"e"、“a”、“e”、“a”、“a”、"123"去除后得到有效子串序列:“n”、“zh”、“lov”、“j”、“v”,其中"lov"里不同字母的数量为3(有’l’、‘o’、'v’三个不同字母),故输出3。
因为最近的个数字符串只有一个,故不用字典表顺序比较。
🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(Python)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,发现新题目,随时更新,全天CSDN在线答疑。