---
# System prepended metadata

title: 1239. Maximum Length of a Concatenated String with Unique Characters
tags: [string, Leetcode, medium, python, array, c++]

---

###### tags: `Leetcode` `medium` `string` `array` `python` `c++`

# 1239. Maximum Length of a Concatenated String with Unique Characters

## [題目連結:] https://leetcode.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/description/

## 題目:
You are given an array of strings ```arr```. A string s is formed by the **concatenation** of a **subsequence** of ```arr``` that has **unique characters**.

Return the **maximum** possible length of ```s```.

A **subsequence** is an array that can be derived from another array by deleting some or no elements without changing the order of the remaining elements.

**Example 1:**
```
Input: arr = ["un","iq","ue"]
Output: 4
Explanation: All the valid concatenations are:
- ""
- "un"
- "iq"
- "ue"
- "uniq" ("un" + "iq")
- "ique" ("iq" + "ue")
Maximum length is 4.
```
**Example 2:**
```
Input: arr = ["cha","r","act","ers"]
Output: 6
Explanation: Possible longest valid concatenations are "chaers" ("cha" + "ers") and "acters" ("act" + "ers").
```
**Example 3:**
```
Input: arr = ["abcdefghijklmnopqrstuvwxyz"]
Output: 26
Explanation: The only string in arr has all 26 characters.
```

## 解題想法:
* 此題為連接arr中的字串，連結條件為不可有重複字符
	* return 最終max長度
* DFS遞迴判斷:
	* def dfs(arr, curString, curPos):
		* arr: 原數組
		* curString: 當前串聯的字串
		* curPos: arr中的位置
	* dfs中每次判斷curString是否有重複字符
		* **判斷方法**:
		* len(set(curString))!=len(curString)
		* 若不相等表示有重複字符: return 0
	* for i in range(curPos, len(arr)):
		* 往後遞迴

## Python:
``` python=
class Solution(object):
    def maxLength(self, arr):
        """
        :type arr: List[str]
        :rtype: int
        """
        #連接字串，且不能有重複字符
        return self.dfs(arr,"",0)
    def dfs(self, arr, curString, curPos):
        curSet=set(curString)
        if len(curSet)!=len(curString):
            return 0
        res=len(curString)
        for i in range(curPos,len(arr)):
            res=max(res,self.dfs(arr, curString+arr[i], i+1))
        return res
```

## C++:
``` cpp=
class Solution {
public:
    int maxLength(vector<string>& arr) {
        return dfs(arr, "", 0);
    }

    int dfs(vector<string>& arr, string curString, int curPos){
        unordered_set<char> curSet(curString.begin(), curString.end());
        if (curSet.size()!=curString.size()) //have duplicate char
            return 0;
        int res=curString.size();
        for (int i=curPos; i<arr.size(); i++){
            res=max(res, dfs(arr, curString+arr[i], i+1));
        }
        return res;
    }
};
```