Medium草稿★★★★★O(n) 時間 · O(n) 空間
BacktrackingStringHash Table
Patterns🌿 回溯#️⃣ 雜湊
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1980Find Unique Binary StringBacktrackingMediumBacktracking

給定一個字串陣列 nums,包含 n 個長度為 n 的互不相同的二進位字串。回傳一個長度為 n 且不在 nums 中的二進位字串(保證至少存在一個答案)。

Example:

Input: nums = [“01”,“10”] Output: “11”

Intuition

TIP

核心思路:用 Cantor 對角線法,第 i 位取 nums[i] 第 i 位的反,保證結果與每個字串至少一位不同。

Approaches

1. Backtracking / Brute Force — O(2^n * n) / O(n^2)
  • Idea: 用 HashSet 存所有 nums,嘗試構造每個可能的二進位字串直到找到不在集合中的
  • Time: O(2^n * n) 最差情況
  • Space: O(n^2)
class Solution {
    fun findDifferentBinaryString(nums: Array<String>): String {
        val set = nums.toHashSet()
        val n = nums[0].length

        fun backtrack(current: StringBuilder): String? {
            if (current.length == n) {
                val s = current.toString()
                return if (s !in set) s else null
            }

            for (bit in charArrayOf('0', '1')) {
                current.append(bit)
                val result = backtrack(current)
                if (result != null) return result
                current.deleteCharAt(current.lastIndex)
            }

            return null
        }

        return backtrack(StringBuilder())!!
    }
}
⭐ 2. Cantor Diagonal — O(n) / O(n)
  • Idea: 第 i 位取 nums[i][i] 的反,保證構造出的字串與每個 nums[i] 都不同
  • Time: O(n)
  • Space: O(n)
class Solution {
    fun findDifferentBinaryString(nums: Array<String>): String {
        val sb = StringBuilder()
        for (i in nums.indices) {
            sb.append(if (nums[i][i] == '0') '1' else '0')
        }
        return sb.toString()
    }
}

🔑 Takeaways