字符串处理,纯考察细节处理。。注意一定要细心,WA了好几次了,算法的话没啥好说的,各种情况多考虑就是了,附上搜到的一组数据应该能判出来算法对错了
import java.util.Scanner;
public class Main
{
static void solve(String s)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++)
if (Character.isAlphabetic(s.charAt(i)))
sb.append(s.charAt(i));
String src = sb.toString();
boolean find = false;
for (int i = 1; i <= src.length() / 2; i++)
{
String prefix = src.substring(0, i);
if (isBeginTwoAB(src, prefix))
{
String remain = src.substring(prefix.length() * 2);
if (isFirst(prefix, remain) || isSecond(prefix, remain))
{
find = true;
break;
}
}
}
System.out.println(find ? "Yes" : "No");
}
static boolean isFirst(String prefix, String remain)
{
if (remain.length() < prefix.length() && prefix.startsWith(remain))
{
String B = prefix.substring(remain.length());
return !remain.equals(B);
}
return false;
}
static boolean isCAB(String AB, String C)
{
for (int i = 1; i < AB.length(); i++)
{
String A = AB.substring(0, i);
String B = AB.substring(i);
if (!C.equals(A) && !C.equals(B) && !A.equals(B))
return true;
}
return false;
}
static boolean isSecond(String prefix, String remain)
{
if (remain.length() > prefix.length() && remain.endsWith(prefix))
{
String C = remain.substring(0, remain.length() - prefix.length());
return isCAB(prefix, C);
}
return false;
}
static boolean isBeginTwoAB(String s, String prefix)
{
int i = s.indexOf(prefix, prefix.length());
return i == prefix.length() && s.length() > prefix.length() * 2;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
sc.nextLine();
while (T-- > 0)
{
String line = sc.nextLine();
solve(line);
}
sc.close();
}
}
/*
8
xyxyxxy
xyxyyxy
xxxxyxx
xxxxx
xyxyx
xxxxxxxx
xxxxxxxxxxxxx
xyzzxyzxyzzxyzxyzxyzzxyz
No
No
No
No
Yes
Yes
Yes
Yes
*/