题目
给你一个数组 arr
,数组中有 n
个 非空 字符串。
请你求出一个长度为 n
的字符串数组 answer
,满足:
answer[i]
是arr[i]
最短 的子字符串,且它不是arr
中其他任何字符串的子字符串。如果有多个这样的子字符串存在,answer[i]
应该是它们中字典序最小的一个。如果不存在这样的子字符串,answer[i]
为空字符串。
请你返回数组 answer
。
示例 1:
输入:arr = ["cab","ad","bad","c"] 输出:["ab","","ba",""] 解释:求解过程如下: - 对于字符串 "cab" ,最短没有在其他字符串中出现过的子字符串是 "ca" 或者 "ab" ,我们选择字典序更小的子字符串,也就是 "ab" 。 - 对于字符串 "ad" ,不存在没有在其他字符串中出现过的子字符串。 - 对于字符串 "bad" ,最短没有在其他字符串中出现过的子字符串是 "ba" 。 - 对于字符串 "c" ,不存在没有在其他字符串中出现过的子字符串。
示例 2:
输入:arr = ["abc","bcd","abcd"] 输出:["","","abcd"] 解释:求解过程如下: - 对于字符串 "abc" ,不存在没有在其他字符串中出现过的子字符串。 - 对于字符串 "bcd" ,不存在没有在其他字符串中出现过的子字符串。 - 对于字符串 "abcd" ,最短没有在其他字符串中出现过的子字符串是 "abcd" 。
提示:
n == arr.length
2 <= n <= 100
1 <= arr[i].length <= 20
arr[i]
只包含小写英文字母。
解题思路
先将arr中的每一个子字符串求出来,并判断这些子字符串是否在其他字符串中,若是,则删除这些子字符串,否则放到一个a_list中。最后将a_list中与arr对应子字符串排序,并取出字典序最小的到answer中。
代码
class Solution(object):
def shortestSubstrings(self, arr):
"""
:type arr: List[str]
:rtype: List[str]
"""
answer = []
#a = 'cab'
#存储所有的子字符
a_list = []
a_exit = set()
n = len(arr)
for a in arr:
a_list_temp = []
for i in range(len(a)):
# print(f'a[i]:{a[i]}')
# print(f'a_temp:{a_temp}')
for j in range(i+1,len(a)+1):
# print(f'i:{i}')
# print(f'j:{j}')
i_add_j = a[i:j]
#print(i_add_j)
#判断是否是这次存在的子字符串
if i_add_j in a_list_temp:
continue
#判断是否已经存储过
#存储过则加入到a_exit中
#加入到a_list中
if i_add_j in a_list:
a_exit.add(i_add_j)
#没存储过则存储到a_list中
else:
a_list_temp.append(i_add_j)
a_list_temp.append(',')
a_list.extend(a_list_temp)
for i in a_exit:
a_list.remove(i)
#print('after_remove',a_list)
index = 0
index_dot = 0
for k in range(n):
index_dot = a_list[index:].index(',')
# print(f'index:{index}')
# print(f'index_dot:{index_dot}')
# print(a_list[index:index_dot])
if index_dot == 0:
answer.append('')
index +=1
continue
index_dot += index
x = sorted(a_list[index:index_dot],key=lambda x: (len(x), x))[0]
# print(f'x:{x}')
# print('index_dpt:',a_list[index:index_dot])
# print('a_list:',a_list)
answer.append(x)
index = index_dot + 1
return answer