思路:栈 + 模拟

将所有操作对应的字符压栈,每次遇到撤销操作 时,判断栈是否为空,若不为空则弹出栈顶元素,相当于撤销一次操作,若为空则不做操作。由于四种操作都单独在 轴或单独在 轴上移动,所以与操作顺序无关,依次从栈里弹出操作并依次执行即可。

代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    string a;
    cin >> a;
    stack<char> s;
    int x = 0, y = 0;
    for(int i = 0; i < n; i++) {
        if(a[i] != 'Z') s.push(a[i]);
        else if(!s.empty()) s.pop();
    }

    while(!s.empty()) {
        char c = s.top();
        s.pop();
        if(c == 'W') y++;
        else if(c == 'A') x--;
        else if(c == 'S') y--;
        else if(c == 'D') x++;
    }
    cout << x << " " << y << endl;
}

复杂度分析

时间复杂度:
空间复杂度:,利用了辅助栈