java语言实现回文数索引--牛客网

目录

1 题目描述

2 解题思路

3 代码实现


1 题目描述

给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。

 

2 解题思路

输入一个字符串,判断其是否为回文,若为回文,输出-1;若不是回文,则删除该字符串中的一个字符,使其变成回文结构,并且返回该字符对应的下标。首先我们不难想到:定义一个judge函数来判断该字符串是否是回文,若是返回-1;若不是返回构不成回文的字符下标,此时有两种情况:类似于abbbbb、bbbbbbcb,有可能返回前半部分不构成回文结构的字符下标, 也有可能是后半部分的某个下标,但是这两个下标之间是有相关性的:两者之和为字符数组长度,所以在对返回值进行判定时,可以将返回字符删除,再进行一次判断,若返回-1则说明该位置是不构成回文结构的字符,返回该字符下标即可;否则返回与之互补的下标即可。

3 代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bf.readLine());
        for (int i = 0; i < n; i++) {
            String s = bf.readLine();
            int res = judge(s);
            //若该字符串为回文结构,直接输出-1
            if (res == -1){
                System.out.println(-1);
            }else {
                //记录下不是回文结构的字符的下标。
                int x = res;
                //将影响回文结构的字符进行删除
                String str = s.substring(0,x)+s.substring(x+1,s.length());
                //再次进行判断,并取得返回值。此处需要注意的是,类似于abbbb,bbbbbcb这种
                //回文结构,返回值中影响回文结构的字符下标可能在前半部分,也可能在后半部分
                //题目已经明确的告诉我们了:总有一个合法的解,所以这两种返回情况无可厚非~
                int a = judge(str);
                if (a == -1){
                    //若返回值为-1,说明该位置的字符影响了结构
                    System.out.println(x);
                }else {
                    //否则就是与x位置对称的字符影响了回文结构
                    System.out.println(s.length()-1-x);
                }
            }
        }
    }
    //判断一个字符串是否是回文结构,若是,返回-1;若不是,返回不相等处字符的索引下标
    public static int judge(String str){
        int i = 0;
        int j = str.length()-1;
        char[] chars = str.toCharArray();
        while (i < j){
            if (chars[i]!=chars[j]){
                //如果遇到不相等的字符,返回该字符所对应的下标
                return i;
            }
            i++;
            j--;
        }
        //在循环中没有return出去,说明该字符串为回文结构
        return -1;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值