【蓝桥杯】回文字符串
回文字符串
- 问题描述
- 代码
- 易错:
回文字符串
问题描述
小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 S,小蓝可以往字符串 S 的开头处加入任意数目个指定字符: l、q、b(ASCII 码分别为: 108、113、98)。小蓝想要知道他是否能通过这种方式把字符串 S 转化为一个回文字符串。
输入格式
输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。
接下来依次描述 T 组数据。
每组数据一行包含一个字符串 S
输出格式
输出 T 行,每行包含一个字符串,依次表示每组数据的答案。如果可以将 S 转化为一个回文字符串输出 Yes,否则输出 No。
样例输入
3
gmgqlq
pdlbll
aaa
样例输出
Yes
No
Yes
样例说明
对于 gmgqlq,可以在前面加上
qlq→qlqgmgqlq 转化为一个回文字符串;
对于 pdlbll,无法转化为一个回文字符串;
对于 aaa,本身就是一个回文字符串。
评测用例规模与约定
对于 50% 的评测用例, 1≤∣S∣≤1000,其中 ∣S∣ 表示字符串 S 的长度;
对于所有评测用例, 1≤T≤10,1≤∑∣S∣≤10 6
代码
注意全为特殊字符时的处理
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String str = new String();
String lbq = "lbq";
sc.nextLine();//nextInt()不读空白符
for (int i = 0; i < n; i++) {
str = sc.nextLine();
int len = str.length(), len1 = 0, len2 = 0;
int left = 0, right = len - 1;
while (right >= 0 && lbq.indexOf(str.charAt(right--)) != -1) {
len2++;
}
while (left < right && lbq.indexOf(str.charAt(left++)) != -1) {
len1++;
}
if (len1 > len2) {
System.out.println("No");
} else if (isPLR(str.substring(0, len - len2 + len1))) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
public static boolean isPLR(String str) {
int left = 0;
int right = str.length() - 1;
while (left < right) {
if (str.charAt(left) != str.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
}
易错:
考虑不全面 虽然写成这样也可能会过 但 是运气好的
例如qmzmllq就会出错 应该是No但会输出Yes
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
while (t-- > 0) {
String s = scan.next();
System.out.println(f(s) ? "Yes" : "No");
}
}
public static boolean f(String s) {
int l = 0;
int r = s.length() - 1;
while (l < r) {
if (s.charAt(l) == s.charAt(r)) {
l++;
r--;
} else {
if (s.charAt(r) == 'l' || s.charAt(r) == 'q' || s.charAt(r) == 'b') {
r--;
} else {
return false;
}
}
}
return true;
}
}