力扣之数组中的最短非公共子字符串(python)

题目

给你一个数组 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

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值