这道题的难点在于对题目要求的理解,即什么情况下字符串应该是正确的。
将答案正确的条件翻译过来就是下边四条,同时满足下边四个条件就判定为正确。
- 只含有 P A T 三种字符
- P与T有且仅有一个
- P与T之间至少有一个A
- P之前的A的数量 * P与T之间A的数量 = T之后的A的数量
附上用Java实现的代码:
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int arrLength = in.nextInt();
String[] strArr = new String[arrLength];
for (int i = 0; i <= strArr.length - 1; i++)
{
strArr[i] = in.next(); //如果使用nextLine会产生缓冲区遗留问题
if (strIsOk(strArr[i]))
{
System.out.println("YES");
}
else
{
System.out.println("NO");
}
}
}
/**
* 检测字符串是否合法
* @param str
* @return
*/
private static boolean strIsOk(String str)
{
for (int i = 0; i <= str.length() - 1; i++)
{
if (!(str.charAt(i) == 'P' || str.charAt(i) == 'A' || str.charAt(i) == 'T'))
{
return false;
}
}
if (!pAndTisOne(str))
{
return false;
}
int indexOfP = str.indexOf('P');
int indexOfT = str.indexOf('T');
if (!(indexOfT - indexOfP >= 2))
{
return false;
}
String preP = str.substring(0, indexOfP); //P之前的字符串
String pAndT = str.substring(indexOfP+1, indexOfT);
String sufT = str.substring(indexOfT+1, str.length());
if (preP.length() * pAndT.length() != sufT.length())
{
return false;
}
return true;
}
/**
* 检测P与T是不是只有一个
* @param str
* @return
*/
private static boolean pAndTisOne(String str)
{
int pCount = 0;
int tCount = 0;
for (int i = 0; i <= str.length() - 1; i++)
{
if (str.charAt(i) == 'P')
{
pCount++;
}
if (str.charAt(i) == 'T')
{
tCount++;
}
}
if (pCount == 1 && tCount == 1)
{
return true;
}
else
{
return false;
}
}
}