Trace
6.19 每日一题
传送门:https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/
Problem
给定一个字符串数组 arr
,字符串 s
是将 arr
某一子序列字符串连接所得的字符串,如果 s
中的每一个字符都只出现过一次,那么它就是一个可行解。
请返回所有可行解 s
中最长长度。
示例 1:
1 2 3
| 输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是 "","un","iq","ue","uniq" 和 "ique",最大长度为 4。
|
示例 2:
1 2 3
| 输入:arr = ["cha","r","act","ers"] 输出:6 解释:可能的解答有 "chaers" 和 "acters"。
|
示例 3:
1 2
| 输入:arr = ["abcdefghijklmnopqrstuvwxyz"] 输出:26
|
数据范围:
1 2 3
| 1 <= arr.length <= 16 1 <= arr[i].length <= 26 arr[i] 中只含有小写英文字母
|
思路
arr.length <= 16,可以dfs。
最近能dfs就dfs,多练习下,之前总是因为写的太丑TLE。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| class Solution { public: unordered_map<char,int> mp; int Max=0; void dfs(int k,int len,vector<string>& arr){ if(k==arr.size()){ return ; } bool flag=true; unordered_map<char,int> mp2; for(int i=0;i<arr[k].size();i++){ mp2[arr[k][i]]++; if(mp2[arr[k][i]]>=2){ flag=false; } } for(int i=0;i<arr[k].size();i++){ if(mp[arr[k][i]]!=0){ flag=false; } } if(flag){ for(int i=0;i<arr[k].size();i++){ mp[arr[k][i]]++; } len+=arr[k].size(); Max=max(Max,len); dfs(k+1,len,arr); for(int i=0;i<arr[k].size();i++){ mp[arr[k][i]]--; } len-=arr[k].size(); dfs(k+1,len,arr); } else{ dfs(k+1,len,arr); } } int maxLength(vector<string>& arr) { dfs(0,0,arr); return Max; } };
|
明天填坑剪枝优化。