“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
- 字符串中必須僅有
P
、A
、T
這三種字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以獲得“答案正確”,其中x
或者是空字符串,或者是僅由字母A
組成的字符串; - 如果
aPbTc
是正確的,那麼aPbATca
也是正確的,其中a
、b
、c
均或者是空字符串,或者是僅由字母A
組成的字符串。
現在就請你爲 PAT 寫一個自動裁判程序,判定哪些字符串是可以獲得“答案正確”的。
輸入格式:
每個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (<10),是需要檢測的字符串個數。接下來每個字符串佔一行,字符串長度不超過 100,且不包含空格。
輸出格式:
每個字符串的檢測結果佔一行,如果該字符串可以獲得“答案正確”,則輸出 YES
,否則輸出 NO
。
輸入樣例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
輸出樣例:
YES
YES
YES
YES
NO
NO
NO
NO
這道題主要讀着比較懵,參考了幾個博主思路大抵都是:以P\T來區分,中間加前面的a的數量等於T後的A的數量
事實證明,我就沒仔細看人家的思路。我從頭到尾都理解錯了
代碼
第一版:
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
int n = 0;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
boolean flag = false;
List<String> arrayList = new ArrayList<String>();
for (int i = 0; i < n; i++) {
String nextLine = scanner.next();
nextLine.replace(" ", "");
arrayList.add(nextLine.trim());
}
for (String s : arrayList) {
char[] charArray = s.toCharArray();
// 第一個條件判斷
for (int i = 0; i < charArray.length; i++) {
if (charArray[i] != 'P' && charArray[i] != 'A' && charArray[i] != 'T') {
System.out.println("NO");
flag = true;
break;
}
}
if (flag == false) {
// 第二個判斷條件
int indexOf = s.indexOf("PAT");
if (indexOf >= 0) {
if (indexOf == 0) {
if (s.length() == 3) {
System.out.println("YES");
continue;
}
} else {
if (indexOf == (s.length() - (indexOf + 3))) {
for (int i = 0; i < indexOf; i++) {
if (charArray[i] != 'A') {
System.out.println("NO");
flag = true;
break;
}
}
if (flag == false) {
for (int i = indexOf + 3; i < s.length(); i++) {
if (charArray[i] != 'A') {
System.out.println("NO");
flag = true;
break;
}
}
if (flag == false) {
System.out.println("YES");
continue;
}
}
} else {
System.out.println("NO");
continue;
}
}
}
if (flag == false) {
// 第三個條件——先行分割P/T
int indexOfP = s.indexOf("P");
int indexOfT = s.indexOf("T");
for (int i = 0; i < indexOfP; i++) {
if (charArray[i] != 'A') {
System.out.println("NO");
flag = true;
break;
}
}
if (flag == false) {
for (int i = indexOfT + 1; i < s.length(); i++) {
if (charArray[i] != 'A') {
System.out.println("NO");
break;
}
}
if (indexOfT - 1 != s.length() - 1 - indexOfT) {
System.out.println("NO");
continue;
} else {
System.out.println("YES");
continue;
}
}
}
}
}
}}
這一版部分正確,還只對了一個????暫時沒有找到錯在哪裏
其他人的答案:
第二版:
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
int flagSum = 0;
ArrayList<String> stringList = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
flagSum = Integer.parseInt(sc.nextLine());
for (int i = 0; i < flagSum; ++i) {
stringList.add(sc.nextLine());
}
for (String x : stringList) {
judge(x);
}
}
public static void judge(String s) {
String pattern = "A*PA+TA*";
String pattern1 = "PA+T";
if (s.matches(pattern)) {
if (s.matches(pattern1)) {
System.out.println("YES");
} else {
String temp[] = s.split("P|T");
int aLength = temp[0].length();
int bLength = temp[1].length();
int cLength = temp[2].length();
//if ((cLength - aLength) / aLength == (bLength - 1)) {
if(bLength*aLength==cLength){
System.out.println("YES");
} else {
System.out.println("NO");
}
}
} else {
System.out.println("NO");
}
}
}
第三版:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
for(int i=0 ;i<n ;i++){
String s = sc.nextLine();
String news = s;
if(news.contains("P")&&news.contains("A")&&news.contains("T")){
news = news.replace("A", "");
news = news.replace("P", "");
news = news.replace("T", "");
if(news.isEmpty()){
int p = s.indexOf("P");
int t = s.indexOf("T");
int len = s.length();
int b = t-p-1;
int c = len -t -1;
if(p*b==c){
System.out.println("YES");
}else{
System.out.println("NO");
}
}else{
System.out.println("NO");
}
}else{
System.out.println("NO");
}
}
}
}
總結:這道題不應該無腦硬攻,找數字的題就是數字規律爲核心,並且基本功熟練。如果我能想起來contains這個方法,也不用那麼彎彎繞繞了。還有思維方式真的很重要啊。第一版的理解簡直飄到海了。