题目:
这个题要求输入:
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))