注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。
Python基础练习题39:最长的字母升序子字符串
输入一个字符串,该字符串只含有26个小写字母,如s = 'azcbobobegghakl'。在字符串s中,有若干个按字母顺序排序的子字符串,比如'az'、'bo'、'be'、'beggh'、'akl'等。
现要求写一个程序,输出字符串s中按字母升序的最长的子字符串。上面例子中,最长者'beggh'就是所求的。
若有多个相同长度的最长子字符串,取起始索引最靠前的那一个。比如,如果输入的字符串是s = 'abcbcd', 那么输出的子字符串就应该是'abc'。
输入样例:
azcbobobegghakl
输出样例:
按字母升序最长的子字符串是:beggh
输入样例:
abcdafgh
输出样例:
按字母升序最长的子字符串是:abcd
解答:本题比较有挑战性。 解题分两步走:
第一步,找出符合条件的符合条件的s的子字符串。
第二步,比较各符合条件的各个子字符串的长度,取其中最长者。
第一步是难点所在。而要确定子字符串,需要知道其起始索引和结束索引,而关键在于如何确定结束索。我们可以设起始索引为i,然后加一个while循环,设定循环条件为s[i] <= s[i+1],即可达到目的。
需要注意的是,很容易出现string index out of range这类错误,因此要对i的取值范围做一些限制。
s = input()sub = ''ans = ''for i in range(len(s)): m = i # 符合条件的s子字符串的起始索引。 while i < len(s) - 1 and s[i] <= s[i+1]: i += 1 n = i + 1 # 符合条件的s的子字符串的结束索引。 sub = s[m:n] # 输出符合条件的s的子字符串。 if len(ans) < len(sub): # 比较各个符合条件的子字符串的长度,取起始索引最靠前的最长者。 ans = sub # 把ans一直赋予最长的子字符串,随着循环遍历后它就是最长的子字符串。print(f'按字母升序最长的子字符串是:{ans}')
Python基础练习题40:两个字符串合并去重输出
输入两个字符串,合并两个字符串,且对两个字符串的共有元素进行去重,生成一个新的字符串。然后再以列表的形式将新字符串内的元素排序之后再输出。
输入格式:
共两行,每一行为一个字符串。
输出格式:
共一行,为一个列表。
输入样例:
abbbccccdefff
输出样例:
['a', 'b', 'b', 'b', 'c', 'd', 'e', 'f', 'f', 'f']
解答:涉及到去重,多数时候可能会用到集合。又因为去重只是对两个字符串的共有元素而言,其余非共有元素依然可能需要重复,且要用到移除元素、排序和重新组合等操作,所以列表也是需要用到的。
a = list(input())b = list(input())S_a = set(a)S_b = set(b)S = S_a & S_b # S为集合S_a和S_b的交集,S中的元素为列表a、b中的共有元素,且已去重。for i in S: while i in a: a.remove(i) # 移除列表a中的所有a、b共有元素。for i in S: while i in b: b.remove(i) # 移除列表b中的所有a、b共有元素。l = a + b + list(S) #拼接列表a、b和a、b共有元素去重后组成的列表。print(sorted(l)) # 最后排序输出。
Python基础练习题系列至此暂时告一段落。敬请关注新的内容。
Over.