【leetcode】1239. Maximum Length of a Concatenated String with Unique Characters


題目如下:

Given an array of strings arr. String s is a concatenation of a sub-sequence of arr which have unique characters.

Return the maximum possible length of s.

Example 1:

Input: arr = ["un","iq","ue"]
Output: 4
Explanation: All possible concatenations are "","un","iq","ue","uniq" and "ique".
Maximum length is 4.

Example 2:

Input: arr = ["cha","r","act","ers"]
Output: 6
Explanation: Possible solutions are "chaers" and "acters".

Example 3:

Input: arr = ["abcdefghijklmnopqrstuvwxyz"]
Output: 26

Constraints:

  • 1 <= arr.length <= 16
  • 1 <= arr[i].length <= 26
  • arr[i] contains only lower case English letters.

解題思路:首先過濾掉arr中有重復字符的元素,接下來就可以采用BFS的方法進行計算了。怎么判斷兩個字符串是否有相同字符呢?我的方法是把字符串轉成二進制的方式,a對應2^0,c對應2^2,z對應2^25。這樣的話,每一個字符串都可以計算出一個特征值,判斷兩個字符串是否有相同字符,只有判斷兩個特征值與操作的結果是否為0即可。

代碼如下:

class Solution(object):
    def maxLength(self, arr):
        """
        :type arr: List[str]
        :rtype: int
        """
        arr_val = []
        for i in arr:
            val = 0
            if len(set(list(i))) != len(i):continue
            for j in i:
                val |= 2**(ord(j) - ord('a'))
            arr_val.append(val)
        #print arr_val
        queue = []
        if len(arr_val) == 0:return 0
        for (inx,val) in enumerate(arr_val):
            queue.append((inx,val))
        res = 0
        while len(queue) > 0:
            inx,val = queue.pop(0)
            end = True
            for i in range(inx+1,len(arr_val)):
                if val & arr_val[i] != 0:continue
                queue.append((i,val | arr_val[i]))
                end = False
            if end :
                res = max(res,bin(val).count('1'))
        return res

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM