题目意思:
给一个字符串,每种字符都代表一个坐标变换,让求删除一个最短的子串(不为空)使得删除这个子串后最终坐标点位置不变,找到了输出子串的起始位置和结束位置,若找不出这样一个子串,那么输出-1,字符串下标从1~n。
这样记录某个坐标点上一次出现的时间,肯定得想到用map啊!
记录就好了
另外再说一下,map的count是判断这个元素有没有被赋值过,例如,map <int,int> mp; mp[1]=0; mp.count(1)=1;mp[1]=0;
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <cmath>
#include <set>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7;
const int maxn = 200000 + 10;
const int inf = 0x3f3f3f3f;
map<pair<int, int>, int> mp;
char s[maxn];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
int T;
cin >> T;
while (T--)
{
int n;
mp.clear();
cin >> n;
scanf("%s", s + 1);
int L, R;
int ans = inf;
int x = 0, y = 0;
mp[{0, 0}] = 0;
for (int i = 1; i <= n; i++)
{
if (s[i] == 'L')
y--;
else if (s[i] == 'R')
y++;
else if (s[i] == 'U')
x--;
else
x++;
pair<int, int> t = make_pair(x, y);
if (mp.count(t))
{
if (ans > i - mp[t])
{
ans = i - mp[t];
L = mp[t] + 1; // 从上一次出现的下一个位置开始删除!
R = i; // 删除到当前位置!
}
}
mp[t] = i; // 更新当前坐标点出现的时间
}
if (ans == inf)
cout << -1 << endl;
else
cout << L << " " << R << endl;
}
return 0;
}