【蓝桥杯】回文字符串

回文字符串


回文字符串

问题描述

小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值