给出若干个字符串,输出这些字符串的最长公共后缀。
输入格式
由若干组输入组成。
每组输入的第一行是一个整数 N。
N 为 0 时表示输入结束,否则后面会继续有 N 行输入,每行是一个字符串(字符串内不含空白符)。
每个字符串的长度不超过 200。
输出格式
共一行,为 N 个字符串的最长公共后缀(可能为空)。
怎么考虑这个题呢?首先这是一个字符串匹配问题,找最长后缀,所以我们需要从后往前找
这个题的难点
一输入问题:如何输入字符串进行循环比较:这里面用的是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())