ユニークなキャラクターと連結された文字列の1239の最大長さの最大長さの文字列を連結しました
問題の説明
文字列配列を考えるとarr
、文字列がs
されarr
た場合、シーケンスの文字列の連結文字列を取得したs
文字のそれぞれが一度だけ表示され、それが実現可能なソリューションです。
すべての実行可能なソリューションを返却してくださいs
最長の長さ。
例1:
入力: ARR = [ "UN"、 "IQ"、 "UE"]
出力: 4
説明:すべての可能なシリーズの組み合わせ"である"、 "未"、 " IQ"、 "UE"、 "UNIQ" "と" IQUE 4の最大長。
例2:
入力: ARR = [ "チャ"、 "R&LT"、 "ACT"、 "ERS"]
出力: 6
説明:考えられる答えが"chaers"および"acters"を有します。
例3:
入力: ARR = [ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
出力: 26
ヒント:
1 <= arr.length <= 16
1 <= arr[i].length <= 26
arr[i]
これは、小文字のみが含まれています
思考
- タイトル読み
文字列のトピックを必要とされている文字列は、繰り返される文字列の配列を提供されていないで、あなたは繰り返されませんでした文字の最長の文字列を取得するためにスプライシングすることができます。
バックトラック(再帰的)+ DFS剪定
分析スケールアルゴリズム:16層、最大動作に再帰の深さまで2^17
(バックツリーノード)
すべての可能なトラバーサルソリューションのは、文字列の異なる組み合わせ(裏面)を試します
コードの実装
バックトラック(再帰的)+ DFS剪定
class Solution {
private int ans = 0;
public int maxLength(List<String> arr) {
if (arr == null) {
return 0;
}
// 遍历整个字符串数组 获得符合条件的单个字符串最大长度
for (String ar : arr) {
if (nonDuplicate(ar)) {
ans = Math.max(ar.length(), ans);
}
}
// DFS 从0开始 初始字符串为空串
helper(arr, 0, "");
return ans;
}
private void helper(List<String> arr, int idx, String prev) {
// 剪枝 没有重复(符合条件)才可以继续往下走
if (nonDuplicate(prev)) {
ans = Math.max(prev.length(), ans);
} else {
return;
}
// 最后一个节点 返回
if (idx > arr.size()) {
return;
}
// 当前字符串
String cur = arr.get(idx);
// 添加
helper(arr, idx + 1, prev + cur);
// 不添加
helper(arr, idx + 1, prev);
}
private boolean nonDuplicate(String str) {
return str.chars().distinct().count() == str.length();
}
}