题目要求:
写一个函数,这个函数可以接受若干个字符串作为参数,
要求返回这些字符串的最大公共前缀,
比如 如果输入的是:'abcacc','abccdad','abersf'
那么他们的最大公共前缀就是ab
ps:
如果没有公共前缀的话就返回None
提示1:参数的话设置不定长参数即可
提示2:因为考虑到每个字符串长度其实都可以不一样,所以会有在循环中越界的可能,用try可以方便的解决这个问题
好啦!以上是原有的题目要求,提示2中说了会用到try-except语法,但是我的解法并没有用到。
思路:
1、由于不确定参数的数量和每个参数的长度,我们只需计算出一个字符长度列表,获取到每个字符串的长度。
2、获取到字符数量最少的字符串,公共前缀最长也只可能是最短的字符串,这里是解题的关键(极限解体大法),假设公共前缀最大,这种情况下公共前缀就是字符串当中字符数量最少的那个字符串本身。
3、剩下的代码都很简单,代码中都有注释,应该很好理解了。
ps:有任何问题欢迎提问,代码如下:
def pps(*args):
# 计算所有传入参数的长度列表
num_list = [len(one) for one in args]
# 拿到最短字符串的下标
min_index = num_list.index(min(num_list))
# 将元组转为列表
str_list = list(args)
# 将转换列表后的最短字符串取出,赋值给min_str,则列表str_list中的值就少了最短的那个字符串
min_str = str_list.pop(min_index)
# 声明一个列表存放字符串中相同的元素,以便后期拼接为公共前缀
commonality_str_num = list()
# 遍历剔除最小字符串的剩余字符串列表
for j in str_list:
# 默认字符相等数为0
str_num = 0
# 遍历最小字符串的长度,以便用下标获取字符串中的值拿来对比
for i in range(min(num_list)):
# 判断字符是否不相等,不相等证明前缀已经不同
if j[i] == min_str[i]:
# 计算有几个字符相等
str_num += 1
else:
# 如果遇到不相等就直接结束
break
# 将比较后的公共前缀数量加入列表
commonality_str_num.append(str_num)
# 获取最小的公共前缀数量,就是所有字符串的公共前缀
min_commonality_str_num = min(commonality_str_num)
# 判断最短字符串与列表中剩余字符串的最小公共数量是否不为0
if min_commonality_str_num:
# 不为0证明所有字符串存在最小公共字符串数量为min_commonality_str_num
# 通过字符串切片获取公共前缀字符
result = min_str[0:min_commonality_str_num]
else:
# 不存在公共前缀,min_commonality_str_num为0,返回None
result = None
return result
r = pps('1200', '12333', '1123312')
print(r)