最近面笔试题遇坑,做到后面懵X了,到后来才想到其实很简单
题目中的一些巴拉巴拉一堆的废话就不说了
大概是这样的:
要求
输入1:一个长字符串
输入2:一个短字符串
输出:统计长字符串中有多少个与短字符串相似的子串
emm... 一下子就有思路了
好,开始码代码...
按照短字符串的长度将长字符串的子串给穷举(即拆分)一下,代码很简单,在这我封装成一个函数,输出是一个二维列表。
def split_long(long, short):
split_1 = []
for i in range(len(long) - (len(short) - 1)):
tmp = []
for j in range(i, i + len(short)):
tmp.append(long[j])
split_1.append(tmp)
return split_1
但统计的是子串啊,把列表转换为字符,虽然麻烦,但怎么想到就怎么写了
def alter_list_to_str(split_1):
split_2 = []
for item in split_1:
item = ''.join(item)
split_2.append(item)
return split_2
然后呢...? 把拆分的子串和短字符串分别进行比较,然后计数
def count_num(split_2, short):
count = 0
for a_str in split_2:
if a_str == short:
count += 1
return count
嗯... 代码好看,开始 if __name__ == '__main__': .... 开始运行啦...
怎么是0,不是预料中的2?
又开始审题,题目中四个大字:“相似子串”,并不是简单的 == 判断啊, 赶紧回去改代码
注意:这里是统计相似子串,并不是相同子串。比如aba和xyx,12221和yuuuy,huhu和klkl等等为相似子串
怎么解决? 怎么判断两个相似子串返回True呢? 试试正则?试试用set统计,给子串给替换再判断?
用xyx 和 aba 举例,如何判断这两为相似子串呢?
交卷冷静了一下,百度百度... 这么个题居然没博客去写!!
试试用python的IDE测试,考虑到了所有的python字符串处理方法,set('xyx')和set('aba') ,len一下,长度是相等的,合并字符串试试,set('xyxaba'),长度是4,猛然意识,纵向合并,用zip('xyx','aba'),set一下长度也是2啊,于是有了这个条件,试试用数据运行...
while True:
a = input()
b = input()
if len(set(a)) == len(set(b)) == len(set(zip(a,b))):
print('yes')
else:
print('no')
恭喜...
重新返回原来代码,没错!就只需加个判断条件
def is_similar(str1,str2):
return len(set(str1)) == len(set(str2)) == len(set(zip(str1,str2)))
原来的统计个数的代码,换个判断条件而已
def count_num(split_2, short):
count = 0
for a_str in split_2:
if is_similar(a_str,short):
count += 1
return count
加个输入提示
是不是很简单?还是代码量不够啊!不说了...再好好准备笔试吧,给个全部代码走人了,程序猿之路任重道远呐~
def split_long(long, short):
split_1 = []
for i in range(len(long) - (len(short) - 1)):
tmp = []
for j in range(i, i + len(short)):
tmp.append(long[j])
split_1.append(tmp)
return split_1
def alter_list_to_str(split_1):
split_2 = []
for item in split_1:
item = ''.join(item)
split_2.append(item)
return split_2
def count_num(split_2, short):
count = 0
for a_str in split_2:
if is_similar(a_str,short):
count += 1
return count
def is_similar(str1,str2):
return len(set(str1)) == len(set(str2)) == len(set(zip(str1,str2)))
if __name__ == '__main__':
long = input('long string:')
short = input('short string:')
split_1 = split_long(long, short)
split_2 = alter_list_to_str(split_1)
res = count_num(split_2, short)
print(res)