NC200581. BAD String
描述
输入描述
第一行一个数字,表示样例个数。
其中每个样例:
仅包含一行一个只含大写字母的字符串S。
保证S的长度在[2,2000]内。
输出描述
每个样例输出一行。
如果可以得到不是BAD String的S’,请输出任意一个符合要求S’的
如果不存在任何符合条件的S’,请输出"-1"(不带引号)。
示例1
输入:
9 ABD ADB BAD BDA DAB DBA BDD BADBAD BADBADBAD
输出:
DBA BDA DAB ADB DBA ABD BDD BABDAD -1
说明:
第一个样例的样例输出交换了第1个和第3个字符<br/>Python3(3.5.2) 解法, 执行用时: 39ms, 内存消耗: 4528K, 提交时间: 2020-07-31 17:09:32
import random def find(lis): for i in range(len(lis)-2): if s[i]=="B" and s[i+1]=="A" and s[i+2]=="D": return 1 return 0 for _ in range(int(input())): temp=input() mp=[] cnt=0 s=list(temp) for i in range(len(s)-2): if s[i]=="B" and s[i+1]=="A" and s[i+2]=="D": mp.append(i) cnt+=1 if cnt>2: break if cnt>2: print(-1) elif cnt == 2: s[mp[0]],s[mp[1]+1] = s[mp[1]+1],s[mp[0]] print(''.join(s)) elif cnt==1: s[mp[0]],s[mp[0]+1] = s[mp[0]+1],s[mp[0]] print(''.join(s)) else: while True: a=random.randint(0,len(s)-1) b=random.randint(0,len(s)-1) if a==b: continue s[a],s[b] = s[b],s[a] if find(s): s[a],s[b] = s[b],s[a] else: print(''.join(s)) break
C(clang 3.9) 解法, 执行用时: 2ms, 内存消耗: 360K, 提交时间: 2019-12-28 20:21:49
#include <stdio.h> int main() { int T; scanf("%d", &T); scanf("\n"); for (int i = 0; i < T; i++) { char str[2001]; gets(str); int len = strlen(str); char *s1 = strstr(str, "BAD"); if (s1 == NULL) { for (int j = 0; j < len; j++) { char t = str[j]; for (int k = j + 1; k < len; k++) { char o = str[k]; str[j] = str[k]; str[k] = t; if (strstr(str, "BAD") == NULL) { printf("%s\n", str); goto next; } str[k] = o; } str[j] = t; } printf("-1\n"); goto next; } char *s2 = strstr(s1 + 3, "BAD"); if (s2 == NULL) { s1[0] = 'A'; s1[1] = 'B'; printf("%s\n", str); goto next; } char *s3 = strstr(s2 + 3, "BAD"); if (s3 == NULL) { s1[0] = 'A'; s2[1] = 'B'; printf("%s\n", str); goto next; } printf("-1\n"); goto next; next: ; } }
C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 356K, 提交时间: 2019-12-28 21:28:50
#include<bits/stdc++.h> using namespace std; int main(){ int t; string a; string b="BAD"; scanf("%d",&t); while(t--){ cin>>a; int index=0,l=a.size(),ans=0,j=0; int last[2];last[0]=last[1]=0; for(int i=0;i<l;i++){ if(b[index]==a[i]){ index++; if(index==3){ans++;index=0;if(j<2){last[j]=i;j++;}} } else {index=0;if(b[index]==a[i])index++;} } if(ans>2)printf("-1\n"); else if(ans==1){ a[last[0]]='A'; a[last[0]-1]='D'; printf("%s\n",a.c_str()); } else if(ans==2){ a[last[0]-1]='B'; a[last[1]-2]='A'; printf("%s\n",a.c_str()); } else if(ans==0){ if(a[0]=='A'&&a[1]=='B'){ char tem=a[l-1]; a[l-1]=a[0]; a[0]=tem; } else { char tem=a[1]; a[1]=a[0]; a[0]=tem; } printf("%s\n",a.c_str()); } } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 352K, 提交时间: 2019-12-28 21:47:29
#include<iostream> #include<string> #include<vector> using namespace std; vector<int> vp; int main(){ int T,num,i,len; cin>>T; string s; while(T--){ cin>>s; vp.erase(vp.begin(),vp.end()); len=s.length(); num=0; for(i=0;i<len;i++){ if(s[i]=='B'&&s[i+1]=='A'&&s[i+2]=='D'){ num++; vp.push_back(i); i+=2; } } if(num<3){ if(num==1){ swap(s[vp[0]],s[vp[0]+1]); cout<<s<<endl; } else if(num==2){ swap(s[vp[0]+2],s[vp[1]]); cout<<s<<endl; } else{ if(s[0]=='A'&&s[1]=='B'&&s[2]=='D') swap(s[1],s[2]); else swap(s[0],s[1]); cout<<s<<endl; } } else cout<<-1<<endl; } return 0; }