21-6-19 串联字符串的最大长度
作者:互联网
- 串联字符串的最大长度 难度[中等]
给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。
请返回所有可行解 s 中最长长度。
示例 1:
输入:arr = ["un","iq","ue"]
输出:4
解释:所有可能的串联组合是 "","un","iq","ue","uniq" 和 "ique",最大长度为 4。
示例 2:
输入:arr = ["cha","r","act","ers"]
输出:6
解释:可能的解答有 "chaers" 和 "acters"。
示例 3:
输入:arr = ["abcdefghijklmnopqrstuvwxyz"]
输出:26
提示:
- 1 <= arr.length <= 16
- 1 <= arr[i].length <= 26
- arr[i] 中只含有小写英文字母
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:DFS
主要的理解难点是把26个字母的取或不取用二进制来表示 1 为取 0 为不取
class Solution {
//存储每个字母对应的值
static Map<Integer,Integer> map = new HashMap<>();
/**
*
* @param cur 需要计算的值(字符用int来表示)
* @return 返回改值对应的长度
*/
int get (int cur){
if(map.containsKey(cur)) return map.get(cur);
int len = 0;
for(int i=cur;i>0;i-=lowbit(i)) len++;
map.put(cur,len);
return len;
}
/**
* 返回最低位的1
* @param x
* @return
*/
int lowbit(int x){
return x & -x;
}
//最终的值
int ans=Integer.MIN_VALUE;
//统计字符的个数
int n ;
//存储数字化之后的有效字符的值
int []hash;
public int maxLength(List<String> arr) {
n = arr.size();
//存储有效字符的set
Set<Integer> set = new HashSet<>();
//遍历arr 除去 含有重复字符的串
for(String s: arr){
//用来 表示改串转化为数值之后的值
int val = 0;
//遍历该串,查看是否有重复的字符
for(char c:s.toCharArray()){
int t = c-'a';
//用二进制 1 来表示当前位置已有该字符了 ,如 11 表示有 ba 10 为有 b
//如果当前串的该位置为1 则 出现了重复的字符 除去此字串
if(((val>>t)&1)!=0){
val=-1;
break;
}
val |= (1<<t);
}
//如果val 合法则将其存入 set
if(val != -1) set.add(val);
}
n = set.size();
//如果set为空,说明没有符合的串,即无法组成新串,所以返回 0
if(n==0) return 0;
//给 hash 数值开辟合适的空间
hash = new int[n];
//存储hash 的下标
int idx=0;
//记录剩余合法字串的 总价值
int total=0;
for(Integer i:set){
hash[idx++]=i;
total |= i;
}
dfs(0,0,total);
return ans;
}
/**
*
* @param u 当前所在的hash数组下标
* @param cur 已经选择了的字符的总和
* @param total 剩余总价值
*/
void dfs(int u, int cur, int total) {
//做剪枝
if(get(cur|total)<=ans) return;
//边界
if(u==n){
ans = Math.max(ans,get(cur));
return ;
}
//在原有的基础上判断是否能够选择本次搜索的值
//选
if((hash[u]&cur)==0){
dfs(u+1,hash[u]|cur , total-(total & hash[u]));
}
//不选
dfs(u+1,cur,total);
}
}
此文章创于本人学习时的记录,如有错误或更优解还请指出
标签:串联,字符,arr,return,21,19,int,total,cur 来源: https://blog.csdn.net/Harswlgb/article/details/118057483