编程题——python实现统计相似子串

最近面笔试题遇坑,做到后面懵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)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python可以通过使用字符串的内置方法和函数来实现寻找相同子串的功能。以下是一个简单的实现示例: ```python def find_same_substrings(string): substrings = set() # 用集合来存储不重复的子串 length = len(string) # 字符串长度 for i in range(length): for j in range(i+1, length+1): substring = string[i:j] # 从i到j-1的子串 substrings.add(substring) same_substrings = set() # 用集合来存储相同的子串 for substring in substrings: if string.count(substring) > 1: same_substrings.add(substring) return same_substrings # 测试 input_string = "abcabcabc" result = find_same_substrings(input_string) print(result) ``` 以上代码中,我们首先创建一个空集合`substrings`,用于存储所有的子串。然后使用两层循环,通过切片操作得到所有可能的子串,并将它们添加到`substrings`集合中。接下来,我们再创建一个空集合`same_substrings`,用于存储重复出现的子串。通过遍历`substrings`集合中的每个子串,并使用字符串的`count`方法计算它在原字符串中出现的次数,如果大于1,则将其添加到`same_substrings`集合中。 在测试部分,我们定义了一个字符串`input_string`,使用`find_same_substrings`函数查找其中相同的子串,并将结果打印出来。 以上是一种简单的实现方法,可能不是最优的,只适用于较小的字符串。对于大型字符串或者需要更高效的实现方法,可以考虑使用其他数据结构或算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值