AABB
Time Limit: 20 Sec
Memory Limit: 256 MB
题目连接
TC
Description
One day, Jamie noticed that many English words only use the letters A and B. Examples of such words include "AB" (short for abdominal), "BAA" (the noise a sheep makes), "AA" (a type of lava), and "ABBA" (a Swedish pop sensation).
Inspired by this observation, Jamie created a simple game. You are given two strings: initial and target. The goal of the game is to find a sequence of valid moves that will change initial into target. There are two types of valid moves:
Add the letter A to the end of the string.
Reverse the string and then add the letter B to the end of the string.
Return "Possible" (quotes for clarity) if there is a sequence of valid moves that will change initial into target. Otherwise, return "Impossible".
Input
-
The length of initial will be between 1 and 999, inclusive.
-
The length of target will be between 2 and 1000, inclusive.
-
target will be longer than initial.
-
Each character in initial and each character in target will be either 'A' or 'B'.
Output
Class:
ABBA
Method:
canObtain
Parameters:
string, string
Returns:
string
Method signature:
string canObtain(string initial, string target)
(be sure your method is public)
Sample Input
"BBBBABABBBBBBA"
"BBBBABABBABBBBBBABABBBBBBBBABAABBBAA"
Sample Output
"Possible"
HINT
题意
给你一个字符串和一个目标串,通过下列两种操作,问你能不能从字符串跑到目标串:
在后面加一个A
翻转后,再后面加一个B
题解:
倒推,倒着推的顺序是确定的
至于交换和删除,都用标记就好了,是O(1)的
代码
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; class ABBA{ public: int a[10001]; int b[10001]; string canObtain(string initial, string target){ for(int i=0;i<initial.size();i++) if(initial[i]=='A') a[i]=1; else a[i]=2; for(int i=0;i<target.size();i++) if(target[i]=='A') b[i]=1; else b[i]=2; int l=0,r=target.size()-1; while(abs(l-r)+1!=initial.size()) { if(b[r]==2) { if(l<r) r--; else r++; swap(l,r); } else { if(l<r) r--; else r++; } } int flag=0; if(l<r) { for(int i=0;i<initial.size();i++) { if(a[i]!=b[i+l]) break; if(i==initial.size()-1) flag=1; } } else { for(int i=0;i<initial.size();i++) { if(a[i]!=b[r-i]) break; if(i==initial.size()-1) flag=1; } } if(flag) return "Possible"; else return "Impossible"; } };