回文字符串
题目描述
小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 S ,小蓝可以往字符串 S 的开头处加入任意数目个指定字符:l、q、b (ASCII 码分别为:108、113、98)。小蓝想要知道他是否能通过这种方式把字符串 S 转化为一个回文字符串。
输入格式
输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。接下来依次描述 T 组数据。每组数据一行包含一个字符串 S 。
输出格式
输出 T 行,每行包含一个字符串,依次表示每组数据的答案。如果可以将S 转化为一个回文字符串输出 Yes,否则输出 No 。
样例输入
3
gmgq
lqpdlbll
aaa
样例输出
Yes
No
Yes
解题思路
从字符串两侧搜索,查找到最先不属于l,q,b
的字符,记录两边的下标。判断两个下标之间的字符串是否是回文,如果不是回文,那么添加l,q,b
的字符不能组成回文,如果是回文,那么依次判断两个下标之外的每个字符是否相同,如果不是,那么不能组成回文。
代码
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();scanner.nextLine();String[] str=new String[n];for(int i=0;i<n;i++){str[i]=scanner.next();}for(int i=0;i<n;i++){if(check(str[i])) System.out.println("Yes");else System.out.println("No");}}public static boolean check(String str){if(IsPalindrome(str)) return true;int left=0,right=str.length()-1;boolean flagleft=true,flagright=true;for(int i=0,j=str.length()-1;i<str.length()&&j>-1;i++,j--){if(str.charAt(i)!='l'&&str.charAt(i)!='q'&&str.charAt(i)!='b'&&flagleft) {left=i;flagleft=false;}if(str.charAt(j)!='l'&&str.charAt(j)!='q'&&str.charAt(j)!='b'&&flagright) {right=j;flagright=false;}if(!flagleft&&!flagright)break;}String apart=str.substring(left,right+1);if(!IsPalindrome(apart))return false;else{for(int i=left-1,j=right+1;i>-1&&j<str.length();i--,j++){if(str.charAt(i)!=str.charAt(j)) return false;if(i==0) return false;}return true;}}//判断是否为回文public static boolean IsPalindrome(String s){for(int i = 0, j = s.length() - 1; i < j; i++, j--){if(s.charAt(i) != s.charAt(j))return false;}return true;}
}