1. 程式人生 > 其它 >LeetCode——1239. 串聯字串的最大長度(Java)

LeetCode——1239. 串聯字串的最大長度(Java)

題目描述

題幹:
給定一個字串陣列 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

演算法的思路為先將各個字元進行判斷是否可以進行組合,然後在採用一個回溯演算法來處理多個字元的比較

正確程式碼

class Solution {

    int ans = 0;

    //回溯+位運算
    public int maxLength(List<String> arr) {
        List<Integer> masks = new ArrayList<>();
        for (String s : arr) {
            int mask = 0;
            for (int i = 0; i < s.length(); i++) {
                int ch = s.charAt(i) - 'a';
                //如果已經存在則停止判斷
                if (((mask >> ch) & 1) != 0) {
                    mask = 0;
                    break;
                }
                //將當前位置數字置為1
                mask |= 1 << ch;
            }
            if (mask > 0) {
                masks.add(mask);
            }
        }
        return ans;
    }

    public void backtrack(List<Integer> masks, int pos, int mask) {
        if (pos == masks.size()) {
            ans = Math.max(ans, Integer.bitCount(mask));
            return;
        }
        if ((mask & masks.get(pos)) == 0) {
            backtrack(masks,pos + 1, mask | masks.get(pos));
        }
    }
}

總結

這種採用二進位制來儲存對比的思路確實可以解決很多重複或者其他規律的問題

如果文章存在問題或者有其他更好的題解,歡迎在評論區斧正和評論,各自努力,你我最高處見