2020春季百度笔试题1-自由组合前缀字符串数目

题目:

这个题要求输入:
n:串个数
m:串长度
后面是串的具体内容,
要求得到k前缀的全部组合,k可以取1到m中任意值

例如输入:

2 3
ABC
DEF

得到输出:

8

当k=1,则得到AEF和DBC,他们进行自由组合
当k=2, 则得到ABF和DEC,
注意: 当有多个串时,可以进行任意组合,也就是复杂度n*n

并且新生成的串也可以进行组合!!

所以还能得到:
在这里插入图片描述
我就是在这里懵了一会……
但是最后解出来了。
第一次,原本的字符得到的全部前缀和后缀进行组合:
在这里插入图片描述
第二次,新得到的串进行组合:

所以最后得到8个组合,
其中最重要的就是前缀和后缀去重,这个其实让我想到字符串匹配算法,但是我并不记得那个算法了,所以就用了普通的方法。

做了一个简化,就是只对新增加的词组进行新组合检测,因为前缀和后缀的组合之前在旧的词组里出现过,旧的词组的组合固定了前后缀,直到新增加的词组数目为0为止,需要一直检测增加组的组合。
例如输入

2 5
ABCDF
EGHIJ

则不论是原组整个组检测还是增加组都有32种,没有变多:
在这里插入图片描述
我感觉有几个地方还可以简化,但是没有头绪,

string=input()
n=int(string.split(" ")[0])
m=int(string.split(" ")[1])
string=[]
# print(n,m)
for i in range(0,n):
    string.append(input())
#print(string[0][1])


strings=[]
add=0
adds=[]
for i in range(1,m+1):
    front=[]
    back=[]
    k=i
    for j in range(0,n):
        str_front=string[j][0:k]
        #print("str_front:"+str_front)
        if str_front not in front:
            front.append(str_front)
        str_back=string[j][k:m]
        #print("str_back:"+str_back)
        if str_back not in back:
            back.append(str_back)
    # print(front,back)
    for fro in front:
        for bac  in back:
            str_add=fro+bac
            if str_add not in strings:
                strings.append(str_add)
                add+=1
                adds.append(str_add)
# print(strings)
def zuhe(strings,string):
    add=0
    adds=[]
    for i in range(1,m+1):
        front=[]
        back=[]
        k=i
        for j in range(0,len(string)):
            str_front=string[j][0:k]
            #print("str_front:"+str_front)
            if str_front not in front:
                front.append(str_front)
            str_back=string[j][k:m]
            #print("str_back:"+str_back)
            if str_back not in back:
                back.append(str_back)
                
        # print(front,back)
        for fro in front:
            for bac  in back:
                str_add=fro+bac
                if str_add not in strings:
                    strings.append(str_add)
                    add+=1
                    adds.append(str_add)
    
    return add,adds,strings


while(add!=0):
    # print("---------------")
    # print(adds)
    add,adds,strings=zuhe(strings,adds)

print(len(strings))
发布了140 篇原创文章 · 获赞 114 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qinglingLS/article/details/104868108