描述

在一行中输入以空格间隔的若干以字母数字字符组成的字符串(字符串之间不包含其他字符)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
定义一个函数,找出这些字符串的最长的共有前缀并输出‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
如果不存在共有前缀,输出‘NOT FOUND’

  1. 在一行中输入以空格间隔的若干以字母数字字符组成的字符串(字符串之间不包含其他字符)

    1. myStr = input().split() # 根据空格将字符串切分为列表
    2. print(myStr) # 输出查看数据 ['water', 'waiter', 'watt']
  2. 字符串的最大子串不会长于所有最符串中最短的一个,最短字符串可以用min()获取,用key = len作为比较关键字。

    1. ls = input().split() # 输入water waiter watt,切分为列表 ['water', 'waiter', 'watt']
    2. print(min(ls,key=len)) # watt
    3. print(len(min(ls,key=len))) # 4
  3. 定义一个函数,找出这些字符串的最长的共有前缀并输出‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

    想找到这些字符串的共有前缀,可以分别取每个字符串上对应位置的字符放到集合中,如果对应位置上字符的集合长度是1的话,说明字符相同,长度大于1则必有不同的字符。

    1. ls = input().split() # 输入water waiter watt,切分为列表 ['water', 'waiter', 'watt']
    2. for i in range(len(min(ls,key=len))):
    3. print({j[i] for j in ls})

    输入:water waiter watt
    输出:

    1. {'w'} # 长度为1,是最长子串的一部分
    2. {'a'} # 长度为1,是最长子串的一部分
    3. {'i', 't'} # 长度为2,不是最长子串的一部分了
    4. {'e', 't'} # 长度为2,不是最长子串的一部分了

    一旦出现第一个不属于最长子串的字符,那么最长子串的判定就结束了,从开头到当前字符之间的字符串就是最长子串。如果当前位置的序号为 0,说明不存在共同子串,直接返回’NOT FOUND’。

    1. for i in range(len(min(ls,key=len))):
    2. if len({j[i] for j in ls}) != 1: # 如果集合长度不等于1,判定结束
    3. if i == 0:
    4. return 'NOT FOUND' # 如果第一个字符就不同,则不存在共同子串
    5. else:
    6. return ls[0][:i] # 最长子串是从任一单词开头到当前字符之间的字符串

    当只有一个单词或所有单词都相同或最长子串正好与最短单词相同时,程序不会进入if分支,也不会遇到return结束程序,此时可以为for增加一个else子句,返回最短的单词,当只有一个词时,返回第一个单词。

    1. for i in range(len(min(ls,key=len))):
    2. if len({j[i] for j in ls}) != 1: # 如果集合长度不等于1,判定结束
    3. if i == 0:
    4. return 'NOT FOUND' # 如果第一个字符就不同,则不存在共同子串
    5. else:
    6. return ls[0][:i] # 最长子串是从任一单词开头到当前字符之间的字符串
    7. else: # 到循环结束仍未遇到return时执行此子句
    8. return min(ls,key=len) # 只有一个单词或最短单词为最长前缀时

    完整参考代码如下: ```python def prefix(ls): for i in range(len(min(ls,key=len))):

    1. if len({j[i] for j in ls}) != 1: # 如果集合长度不等于1,判定结束
    2. if i == 0:
    3. return 'NOT FOUND' # 如果第一个字符就不同,则不存在共同子串
    4. else:
    5. return ls[0][:i] # 最长子串是从任一单词开头到当前字符之间的字符串

    else: # 到循环结束仍未遇到return时执行此子句

     return min(ls,key=len)           # 只有一个单词或最短单词为最长前缀时
    

if name == ‘main‘: myStr = input().split() # 根据空格将字符串切分为列表 print(prefix(myStr)) # 调用函数处理并输出返回值

用zip()方法
```python
def find_both(strs):
    prefix = ''                      # 空字符串
    for x in zip(*strs):             # 每个单词依次取一个字符组合
        if len(set(x)) == 1:         # 若去重后长度为1则为共有前缀字符
            prefix = prefix + x[0]   # 将共有字符拼接到字符串上
        else:                        # 若出现不同字符结束循环
            break
    if prefix:                       # 若字符串非空
        return prefix                # 返回共有前缀
    else:
        return 'NOT FOUND'


if __name__ == '__main__': 
    str_in = input().split()
    print(find_both(str_in))