华为OD机试真题 Python 实现【字符串解密】【2023 B卷 100分】,附详细解题思路-LMLPHP

一、题目描述

给定两个字符串string1和string2。

string1是一个被加扰的字符串。string1由小写英文字母(‘a’-‘z’)和数字字符(‘0’-‘9’)组成,而加扰字符串由’0’-‘9’、‘a’-'f’组成。string1里面可能包含0个或多个加扰子串,剩下可能有0个或多个有效子串,这些有效子串被加扰子串隔开。

string2是一个参考字符串,仅由小写英文字母(‘a’-‘z’)组成。

你需要在string1字符串里找到一个有效子串,这个有效子串要同时满足下面两个条件:

  1. 这个有效子串里不同字母的数量不超过且最接近于string2里不同字母的数量,即小于或等于string2里不同字母的数量的同时且最大。
  2. 这个有效子串是满足条件(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(参考字符串)。

三、输出描述

输出为一个字符串(有效字符串)。

四、解题思路

  1. 第一行输入一个被加扰的字符串(由小写英文字母(‘a’-‘z’)和数字字符(‘0’-‘9’)组成,而加扰字符串由’0’-‘9’、‘a’-'f’组成);
  2. 第二行输入一个参考字符串;
  3. 获取有效字符串, 这个有效子串里不同字母的数量不超过且最接近于string2里不同字母的数量;这个有效子串是满足条件(1)里的所有子串(如果有多个的话)里字典序最大的一个;
  4. 定义一个变量maxDiffCharNum,不同字符个数最接近的字符串长度;
  5. 定义一个变量maxStr,记录当前最大长度字符串;
  6. 通过正则表达式"[abcdef0123456789]",将第一行被打扰的字符串分割成有效子串;
  7. 遍历有效子串;
  8. 获取不同字符的数量;
  9. 获取数量最接近的个数;
  10. 如果有相同长度的有效子串,取字典序最大的一个;
  11. 输出符合要求的最长有效子串;

五、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 实现【字符串解密】【2023 B卷 100分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路

🏆本文收录于,华为OD机试(Python)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试真题 Python 实现【字符串解密】【2023 B卷 100分】,附详细解题思路-LMLPHP

07-08 14:31