题意
给一个字符串,每种字符都代表一个坐标变换,让求删除一个最短的子串(不为空)使得删除这个子串后最终坐标点位置不变,找到了输出子串的起始位置和结束位置,若找不出这样一个子串,那么输出-1,字符串下标从1~n。
思路
用map记录某个坐标点上一次出现的时间
然后使用count函数判断是否存在当前这个位置
如果这个位置之前来过了,那么就确定左右索引值,每次和一个中间值比较,然后取最小的那个就行了
code
#include<bits/stdc++.h>
#define endl '\n'
#define pi pair<int,int>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2e5+5;
int t,n;
char s[maxn];
map<pi,int> mp;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>t;
while(t--){
mp.clear();
cin>>n;
cin>>(s+1);
int L,R;
int ans=inf;
int x=0,y=0;
mp[pi(x,y)]=0;
for(int i=1;i<=n;i++){
if(s[i]=='L') x--;
else if(s[i]=='R') x++;
else if(s[i]=='U') y++;
else y--;
pi tmp = make_pair(x,y);
if(mp.count(tmp)){
if(ans>i-mp[tmp]){
ans=i-mp[tmp];
L=mp[tmp]+1; // 从上一次出现的下一个位置开始删除!
R=i; // 删除到当前位置!
}
}
mp[tmp]=i; // 更新当前坐标点出现的时间
}
if(ans==inf) cout<<-1<<endl;
else cout<<L<<" "<<R<<endl;
}
return 0;
}
学如逆水行舟,不进则退