【Leetcode周レース160]最大長1239の連結された文字列

ユニークなキャラクターと連結された文字列の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();
    }
}

リソース

世界トップクラスのトーナメントゲームの160週

おすすめ

転載: www.cnblogs.com/slowbirdoflsh/p/11823510.html