第十五届蓝桥杯JAVA A组省赛 ---- 回文字符串

第十五届蓝桥杯JAVA A组省赛 ---- 回文字符串

问题描述(题目链接)

小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 S,小蓝可以往字符串 S 的开头处加入任意数目个指定字符: l、q、b(ASCII 码分别为: 108、113、98)小蓝想要知道他是否能通过这种方式把字符串 S 转化为一个回文字符串。

输入格式

输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。
接下来依次描述 T 组数据。
每组数据一行包含一个字符串 S 。

3
gmgqlq
pdlbll
aaa

输出格式

输出 T 行,每行包含一个字符串,依次表示每组数据的答案。如果可以将 S 转化为一个回文字符串输出 Yes,否则输出 No。

Yes
No
Yes

题解(比官方题解更利于理解,也更高效)

创建两个方法(change,check),change用于对字符串进行调整,check用于检查是否为回文字符串。
//main方法
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...

        //输入
        int num = scan.nextInt();
        String[] arr = new String[num];
        for(int i = 0; i < num; i++){
            arr[i] = scan.next();
        }
        //判断是否符合条件
        for(int i = 0; i < num; i++){
            if(change(arr[i]) == true){
                System.out.println("Yes");
            }else{
                System.out.println("No");
            }
        }
    }

change方法

  • 先判断该数是不是回文字符串,是则直接返回true
  • 记录index_font和index_back,两个索引中间部分是字符串中间不为q,b,l的部分
  • 如果index_font前面的字符数大于index_back后面的字符数,则无法变化为回文字符串,直接返回false
  • 将index_font和index_back中间的字符拼接起来,判断是不是回文字符串,是则直接返回true;
private static boolean change(String s) {
        //判断变化前的数是不是回文字符串,如果是则直接返回
        if(check(s) == true){
            return true;
        }
        //暴力求解
        int sLength = s.length();
        //从左开始记录第一个不为 l,q,b的字母的索引
        int index_font = 0;
        for(int i = 0; i <sLength; i++){
            if(s.charAt(i) != 'l' && s.charAt(i) != 'q' && s.charAt(i) != 'b'){
                index_font = i;
                break;
            }
        }
        //从右开始记录第一个不为l,q,b的字母的索引
        int index_back = 0;
        for(int i = sLength-1; i >= 0; i--){
            if(s.charAt(i) != 'l' && s.charAt(i) != 'q' && s.charAt(i) != 'b'){
                index_back = i;
                break;
            }
        }
        //如果index_font前面的数比index_back后面的数多,则该字符串无法变为回文字符串
        if(index_font > sLength-index_back){
            return false;
        }


        //拼接index_font到index_back之间的字符,并判断是否为回文字符串
        String st= "";
        for(int i = index_font; i <= index_back; i++){
            st += s.charAt(i);
        }

        return check(st);
    }

check方法(返回类型为boolean)

  • 这就是一个简单的判断是不是回文字符串的方法(相对简单)
 private static boolean check(String s) {
        int flag = 1;
        for(int i = 0; i<s.length(); i++){
            //如果不是回文字符串
            if(s.charAt(i)!=s.charAt(s.length()-1-i)){
                flag = 0;
                break;
            }
        }
        return (flag == 1) ? true : false;
    }

你可能感兴趣的:(算法)