【第28天】给定一个字符串S,请你判断它是否为回文字符串 | 回文的判断

本文已收录于专栏
《Java入门一百例》

学习指引

  • 序、专栏前言
  • 序、专栏前言
  • 一、【例题1】
    • 1、题目描述
    • 2、解题思路
    • 3、模板代码
    • 4、代码解析
  • 三、推荐专栏
  • 四、课后习题

序、专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习Java,特别是一些Java学习者难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
   但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
   算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
  学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。

序、专栏前言

  回文的判定是一个非常重要的内容,在任何地方都是一个很重要的考点。对于字符串的回文判定,使用双指针法进行判定是最简易的一种方法。它可以写成一个模板函数,非常简短,大家直接背下来进行使用即可。当然我们学习前也应该清楚回文的定义。
  什么是回文串?
  回文串的定义是一个字符串,从左往右读和从有右往左是一样的,比如 a b c c b a 、 a b f b a abccba、abfba abccbaabfba等等。也就是有对称性质。 这里需要注意的是,当字符串的长度是奇数时,对于最中间的字符通常我们是无视的,它不影响我们对于回文的判断。比如上述说的 a b f b a abfba abfba f f f改成任何字符它都仍然是一个回文串。

一、【例题1】

1、题目描述

  给定一个整数 t ( 1 ≤ n ≤ 1000 ) t(1\leq n \leq1000) t(1n1000)组测试数据,每次给定一个字符串 S S S,字符串长度不超过 1000 1000 1000,请你判断它是否为回文串,如果是则输出Yes,否则输出No

2、解题思路

   ( 1 ) (1) (1)一种思路是根据回文的定义出发,我们使用StringBuilder倒叙获得字符串,判断得到的字符串与原字符串是否相等,相等则为回文串。
   ( 2 ) (2) (2)另一种思路的使用双指针,一个指针指向头另一个指向尾部,判定两个指针指向字符是否相同,如果不同说明不是回文串可以直接退出循环,否则指针同时向内移动,相等时退出循环。

3、模板代码

import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        while (t-->0){
            String s=sc.next();
            System.out.println(check(s)?"Yes":"No");
        }
    }
    static boolean check(String s){
       StringBuilder sb=new StringBuilder();
        for (int i = s.length()-1; i >=0 ; i--) {
            sb.append(s.charAt(i));
        }
        return sb.toString().equals(s);
    }
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        while (t-->0){
            String s=sc.next();
            System.out.println(check(s)?"Yes":"No");
        }
    }
    static boolean check(String s){
       int l=0,r=s.length()-1;
       while (l<r){
           if (s.charAt(l++)!=s.charAt(r--)) return false;
       }
       return true;
    }
}

4、代码解析

  • ( 1 ) (1) (1)两种方法均可,不过更加推荐第二种双指针的做法,这样在判断到非回文串时可以提前跳出循环,效率更高。而且不需要使用空间,推荐大家记住该模板。

三、推荐专栏

《零基础学算法100天》

四、课后习题

序号 题目链接 难度评级
1 回文数 1
2 有效的回文 2
学习有疑问?

你可能感兴趣的:(《Java入门100练》,java,开发语言)