解題說明
Find Unique Binary String
題目描述:
給定一個包含 n 個長度為 n 的二進位字串的陣列 nums,找出一個同樣長度為 n 的二進位字串,使其不在 nums 中。
解題思路:
使用 Cantor 對角線法:構造一個字串 result,其第 i 個字元與 nums[i] 的第 i 個字元不同。
- 若
nums[i][i] == '0',則result[i] = '1',反之亦然。
這保證 result 與每個 nums[i] 至少在第 i 個位置不同,因此 result 一定不在 nums 中。此方法巧妙、簡潔且只需 O(n) 時間。
C++ 解法
複雜度分析
時間複雜度:O(n) — 遍歷 n 個字串各取一個字元。
空間複雜度:O(n) — 結果字串長度為 n。
虛擬碼
1. Initialize empty string result 2. For i from 0 to n-1: a. If nums[i][i] == '0': append '1' to result b. Else: append '0' to result 3. Return result
其他解法
雜湊集合 + 枚舉 O(2^n):將所有 nums 存入集合,然後枚舉所有 n 位二進位字串直到找到不在集合中的。最壞情況 O(2^n),但由鴿巢原理一定能找到(n 位共 2^n 種可能,只有 n 個被使用)。
回溯法 O(2^n):逐位嘗試 '0' 或 '1',利用 Trie 或集合剪枝。時間複雜度比對角線法差很多。
延伸思考
- Cantor 對角線法的數學原理是什麼?為何它保證結果不在集合中?
- 如果需要找出所有不在
nums中的二進位字串,如何高效解決? - 如果
nums中的字串長度大於n(陣列長度),此方法還能用嗎?