給定一個包含唯一元素的整數陣列 nums,回傳所有可能的子集(冪集)。belwo 代碼回傳輸入 [1,2] 的錯誤答案。如何解決?
預期輸出是
[[],[1],[2],[1,2]]
我在這里寫的代碼很好用。但我想知道我們為什么要這樣做 https://leetcode.com/submissions/detail/735373452/
output.remove(output.size()-1);
但是在同一個代碼中,我不回溯,但它仍然列印所有電源組
String s = "ABC";
ps(s, 0, "");
public static void ps(String str, int i, String ans) {
if (i == str.length()) {
System.out.println(" Print " ans);
return;
}
ps(str, i 1, ans str.charAt(i));
ps(str, i 1, ans);
}
uj5u.com熱心網友回復:
簡而言之,您在遞回呼叫期間創建了2 ^ n 個字串,其中n是str. 而 leetcode 中的代碼使用的是單個 List。將元素添加到串列中會在方法呼叫后產生影響,因此需要洗掉元素才能“恢復”串列。
在 Java 中,字串是不可變的。在您的遞回ps函式中,您正在創建新的字串ans str.charAt(i),原來ans的保持不變。因此,您不需要使用回溯。
// say ans == "A", and str.charAt(1) == "B":
ps(str, i 1, ans str.charAt(i));
ps(str, i 1, ans);
// will be called as:
ps("ABC", 2, "AB");
ps("ABC", 2, "A");
在 leetcode 代碼中,它使用了一個 List。所有遞回呼叫共享同一個串列。修改串列將影響以下呼叫。如果我們在呼叫函式之前添加一個元素,我們需要在呼叫函式之后移除該元素。
// ans is a List now, not String: ans == ['A', 'B']
ans.add(str.charAt(i)); // ans == ['A', 'B', 'C']
ps(str, i 1, ans); // ps("ABC", 3, ['A', 'B', 'C'])
// ans is still ['A', 'B', 'C']
// we want to call ps("ABC", 3, ['A', 'B']) now:
ans.remove(ans.size() - 1);
ps(str, i 1, ans);
也許您認為更改順序可能會起作用:
ps(str, i 1, ans);
ans.add(str.charAt(i));
ps(str, i 1, ans);
如果不呼叫它仍然有問題ans.remove(str.charAt(ans.size() - 1)。您可以嘗試更改anstoList<Character>或StringBuilderin 您的函式的型別,并在每次遞回呼叫期間ps列印。ans
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/498196.html
