題目: UVa - 732 - Anagrams by Stack
題目說明
給兩個字串,str、target,求 str 透過 Stack 的 push() 及 pop() 後能否轉換成 target,若可以則輸出所有能達成的操作順序。
解題思路
使用 DFS 即可,對於每層 DFS,可以 push() 進 Stack 也可以 pop() 出 Stack,先直接 push() 並往下執行,接著判斷,若 Stack 的 top() 等於當前檢查到的字元則 pop() 並往下執行。
參考解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <iostream> #include <string> #include <stack> #include <functional>
using namespace std;
static auto __ = [] { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); return 0; }();
int main() { string str, target; stack<char> s;
function<void(int, int, string)> dfs = [&](int i1, int i2, string ret) { if (i2 == target.length()) { cout << ret << '\n'; return; }
if (i1 < str.length()) { s.push(str[i1]); dfs(i1 + 1, i2, ret + (ret.empty() ? "i" : " i")); s.pop(); }
if (!s.empty() && s.top() == target[i2]) { auto tmp = s.top(); s.pop(); dfs(i1, i2 + 1, ret + (ret.empty() ? "o" : " o")); s.push(tmp); } };
while (cin >> str >> target) { s = stack<char>(); cout << "[\n"; if (str.length() == target.length() && !str.empty()) dfs(0, 0, ""); cout << "]\n"; } }
|