python 最长公共字符串后缀【简单易懂,代码可以直接运行】

python 最长公共字符串后缀【简单易懂,代码可以直接运行】

给出若干个字符串,输出这些字符串的最长公共后缀。

输入格式
由若干组输入组成。

每组输入的第一行是一个整数 N。

N 为 0 时表示输入结束,否则后面会继续有 N 行输入,每行是一个字符串(字符串内不含空白符)。

每个字符串的长度不超过 200。

输出格式
共一行,为 N 个字符串的最长公共后缀(可能为空)。
python 最长公共字符串后缀【简单易懂,代码可以直接运行】
python 最长公共字符串后缀【简单易懂,代码可以直接运行】
怎么考虑这个题呢?首先这是一个字符串匹配问题,找最长后缀,所以我们需要从后往前找
这个题的难点
一输入问题:如何输入字符串进行循环比较:这里面用的是while(cin>>n,n)来判断什么时候结束,并设置一个字符串数组,来进行字符串的比较
这里面用到了第一个for循环,第一个for循环的目的是找到你输入的字符串长度的最小值,并且把它设置为len,作为第一次比较的长度
有同学可能会考虑,如果比较之后没有公共后缀怎么办,其实没有相同字符,空格就是公共后缀,会输出空格
二匹配问题,这里面我用到两个for循环和两个flag(标记,因为flag有旗帜的意思,很想标记所以就这样称呼)第一个for循环用来一次遍历该字符数组中存入的所有字符串,第二个字符串用来遍历需要比较的字符串的字符
这个里面是以s[0]为标杆进行比较的,大家可以想一下如果每个字符串都与第1个字符串有相同的后缀,那么这个后缀是他们所有字符串的公共后缀,以此来找到我们要找的公共后缀!
这里面设置了两个flag,第一个success用来标记整体的匹配是否成功,即s[0]与s[1],s[2]等等的整体比较,如果说s[1]都不满足那么s[2]都不会参与比较,s[1]匹配失败则is_name标记true -> false;当此轮匹配结束后,sucess也会变为false执行len–,缩小范围再次进行匹配比较。成功则推出比较循环并输出公共后缀!

这里用到了大量的切片

代码如下:

N = eval(input())
res = ''
flag = 1
while N != 0:
    s = []
    for i in range(0,N):
        s.append(input())
    min = len(s[0])
    res = s[0]
    for i in s:
        if len(i) < min:
            min = len(i)
            res = i
            pass
        pass
    for i in range(0,min):
        flag = 1
        res_new = res[i:min + 1]
        # print(res_new)
        for item in s:
            if res_new != item[len(item) - min + i:len(item)]:
                flag = 0
                break
        if flag == 1:
            print(res_new)
            break
    if flag == 0:
        print()
    N = eval(input())
上一篇:Text数据占位符定义


下一篇:Min_25筛学习笔记