天天看點

面試題-python3 找出兩個字元串中最大公共子字元串前言最大公共子字元串找子串找出公共的子串

前言

算法題(語言不限): 找出兩個字元串中最大公共子字元串,如”abjeccarde”,”sjdgcargde”的最大子串為”car”

最大公共子字元串

解決思路:

1.先周遊a的子字元串

2.判斷a的子字元串同時也在字元串b裡,添加到f清單

3.最後f清單裡面取出最後一個,就是最長的子串了

# 作者-上海悠悠 QQ交流群:717225969
# blog位址 https://www.cnblogs.com/yoyoketang/a = "abjeccarde"
b = "sjdgcargde"
f = []
# i是字串長度,從1到len(a)
for i in range(1, len(a)+1):
# j是下标位置
for j in range(len(a)+1-i):
e = a[j:j+i]
# 判斷字串同時也在b,添加過去
if e in b:
f.append(e)
print(f)
# -1是取出最長的
print(f[-1])           

複制

運作結果:

['a', 'j', 'e', 'c', 'c', 'a', 'r', 'd', 'e', 'ca', 'ar', 'de', 'car']
car           

複制

上面的解決思路,雖然沒太大問題,得到的結果是一樣的,但是這題考的是算法。

要找出最長的子串,可以先從長的子串周遊,判斷符合條件就應該立即結束,沒必要繼續往下找了。

找子串

找出兩個字元串中最大公共子字元串,如”abjeccarde”,”sjdgcargde”的最大子串為”car”。

這又是一個找子串的問題,跟前面解決思路是一樣的,先周遊所有的子串

# 作者-上海悠悠 QQ交流群:717225969
# blog位址 https://www.cnblogs.com/yoyoketang/# 周遊a得到所有的子串
a = "abjeccarde"
b = "absjdgcargde"
f = []
for i in range(1, len(a)+1):
for j in range(len(a)-i+1):
# 生成字串的組合
new_s = a[j:j+i]
f.append(new_s)
print(f)           

複制

運作結果

['a', 'b', 'j', 'e', 'c', 'c', 'a', 'r', 'd', 'e',
'ab', 'bj', 'je', 'ec', 'cc', 'ca', 'ar', 'rd', 'de',
'abj', 'bje', 'jec', 'ecc', 'cca', 'car', 'ard', 'rde',
'abje', 'bjec', 'jecc', 'ecca', 'ccar', 'card', 'arde',
'abjec', 'bjecc', 'jecca', 'eccar', 'ccard', 'carde',
'abjecc', 'bjecca', 'jeccar', 'eccard', 'ccarde',
'abjecca', 'bjeccar', 'jeccard', 'eccarde',
'abjeccar', 'bjeccard', 'jeccarde',
'abjeccard', 'bjeccarde',
'abjeccarde']           

複制

題目是要求找出最長的子串,于是可以反着周遊,子串長度從最長到最小

# 作者-上海悠悠 QQ交流群:717225969
# blog位址 https://www.cnblogs.com/yoyoketang/a = "abjeccarde"
b = "absjdgcargde"
f = []
for i in range(len(a), 0, -1):
for j in range(len(a)-i+1):
# 生成字串的組合
new_s = a[j:j+i]
f.append(new_s)
print(f)           

複制

于是列印結果

['abjeccarde',
'abjeccard', 'bjeccarde',
'abjeccar', 'bjeccard', 'jeccarde',
'abjecca', 'bjeccar', 'jeccard', 'eccarde',
'abjecc', 'bjecca', 'jeccar', 'eccard', 'ccarde',
'abjec', 'bjecc', 'jecca', 'eccar', 'ccard', 'carde',
'abje', 'bjec', 'jecc', 'ecca', 'ccar', 'card', 'arde',
'abj', 'bje', 'jec', 'ecc', 'cca', 'car', 'ard', 'rde',
'ab', 'bj', 'je', 'ec', 'cc', 'ca', 'ar', 'rd', 'de',
'a', 'b', 'j', 'e', 'c', 'c', 'a', 'r', 'd', 'e']           

複制

找出公共的子串

已經周遊出a的子串了,于是判斷子串也同時在b裡面就可以了, 找到之後用break跳出循環

# 作者-上海悠悠 QQ交流群:717225969
# blog位址 https://www.cnblogs.com/yoyoketang/a = "abjeccarde"
b = "absjdgcargde"
f = []
# 周遊查找字串長度從最長到1
for i in range(len(a), 0, -1):
for j in range(len(a)+1-i):
e = a[j:j+i]
if e in b:
f.append(e)
# 符合條件就結束跳出循環
break
if f:
break  # 跳出外面的循環
print(f[0] if f else None)           

複制

運作結果:car

如果考慮到有多個值符合條件,可以去掉裡層的break

# 作者-上海悠悠 QQ交流群:717225969
# blog位址 https://www.cnblogs.com/yoyoketang/a = "abjeccardek"
b = "absjdgcargdek"
f = []
# 周遊查找字串長度從最長到1
for i in range(len(a), 0, -1):
for j in range(len(a)+1-i):
e = a[j:j+i]
if e in b:
f.append(e)
# # 符合條件就結束跳出循環,考慮到多個值,去掉裡層break
# break
if f:
break  # 跳出外面的循環
print(f)           

複制

運作結果:[‘car’, ‘dek’]