1、问题描述
String:字符串是由数字、字母、下划线等组成的一串字符。字符串的有关操作,各个大厂笔试、面试高频问题,如输入2个字符串,求2个字符串的最长公共字符串。
本文用Python语言实现2个字符串S1、S2中寻找最长公共字符串(长度相等,都打印)。
2、源代码
#判断s2是否s1的子字串 def judgy_substring(s1,s2): slen1= len(s1) slen2 = len(s2) if slen2 > slen1: s1, s2 = s2, s1 slen1, slen2 = slen2, slen1 for i in range(slen1): if slen2+i > slen1: return False if s1[i] == s2[0] and s1[i:slen2+i] == s2: return True else: return False #从两个字符串s1,s2寻找最长公共字符串 def search_common_substring(s1,s2): slen1= len(s1) slen2 = len(s2) substring = [[]] #考虑相同字符串情况,赋值成[[]] if slen2 > slen1: s1,s2 = s2,s1 slen1,slen2 = slen2,slen1 for i in range(slen2): tmp=[].copy() if slen2==1 and s2 in list(s1): #考虑特殊情况 return s2 s2 = list(s2) for j in range(slen2,i,-1): sub_s2 = ''.join(s2[i:j].copy()) #s2[i:j] 是必须是list不支持字符串 if judgy_substring(s1,sub_s2): tmp = list(sub_s2) break else: continue if len(tmp) > len(substring[0]): substring = [[]] substring.append(tmp.copy()) #这里用list浅拷贝,独立记录每轮遍历结果 substring.remove([]) elif len(tmp) == len(substring[0]): substring.append(tmp.copy()) if not substring: print("not find common substring!!!") return '' return substring
3、运行结果
输出字符串S1:12345098547=133
输出字符串S2:123451985471133
最大子字符串结果:
12345 98547
4、编码感想
从两个字符串S1,S2如何动态寻找最长子字串,而字符串长度和位置都是不可知。这种情况遍历最长字符串S1,记录从S1每个字符位置开始,再去遍历字符串S2,起止位置是S2每个字符位置,因为要求是最长子字串,终止位置是从S2最后一个位置开始寻找,一旦找到, 跳出内层循环。进入外层循环下一个字符,重复。如果发现外层下一个循环的最大公共字符串更大,取最大;如果相同,同时记录下来。最后返回。