【Java版oj】day05统计回文

  目录

一、原题再现

二、问题分析

三、完整代码


一、原题再现

统计回文_牛客题霸_牛客网

描述

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
* 在A的第一个字母之前: "baba" 不是回文
* 在第一个字母‘a’之后: "abba" 是回文
* 在字母‘b’之后: "abba" 是回文
* 在第二个字母'a'之后 "abab" 不是回文
所以满足条件的答案为2

输入描述:

每组输入数据共两行。 第一行为字符串A 第二行为字符串B 字符串长度均小于100且只包含小写字母

输出描述:

输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数

示例1

输入:

aba

b

输出:

2

二、问题分析

        回文串就是前后对称的字符串。本题是判断是否是回文串的变形题。字符串本身不一定是回文,把第二个字符串插入进去看是否是回文。本题使用暴力求解方式计算即可。方法二是大家都首先想到的利用String类的相关操作进行求解。方法一则是结合了链表。

方法一:

        现将原字符串A添加进链表,然后从头开始遍历,将字符串B添加进链表,依次添加在字符串A首字符的前面,首字符的后面,第二个字符的后面.......最后一个字符的后面,每次添加后就进行回文比较、删除字符串B的操作、是否计数等操作。全程只需要在一个链表中进行增删操作。

        

方法二:

        遍历str1,将str2 insert进入str1的每个位置,判断是否是回文,这里注意的是,判断回文的时候,直接将字符串逆置,看是否相同就好了。是就++count;需要注意的是这里不能str1.insert(i,str2),这样的话str1改变了,判断下一个位置就不对了。所以每次使用str1重新给一个str,然后str.insert(i, str2),再判断。全程需要定义多个StringBuffer str = new StringBuffer(str1);

三、完整代码

import java.util.*;
import java.lang.*;
public class Main {
    public static boolean isPalindrome(List list) {
        int len = list.size()-1;
        for (int i = 0; i < len / 2; i++) {
            if (list.get(i) != list.get(len - 1 - i)) {
                return false;
            }
        }
        return true;
    }
    public static void addStr(List <Character> list, String str) {
        for (int i = 0; i < str.length(); i++) {
            list.add(str.charAt(i));
        }
        list.add(' ');
    }
    public static void addStr(List <Character> list, String str, int i) {
        for (int j = str.length() - 1; j >= 0; j--) {
            list.add(i, str.charAt(j));
        }
    }
    public static void removeStr(List <Character> list, String str, int i) {
        for (int j = 0; j < str.length();j++) {
            list.remove(i);
        }
    }
    public static void main(String[] args) {
        List<Character>list = new ArrayList<>();
        Scanner in = new Scanner(System.in);
        String strA = in.nextLine();
        String strB = in.nextLine();
        int count = 0;
        addStr(list, strA);
        for (int i = 0; i < list.size(); i++) {
            addStr(list, strB, i);
            if (isPalindrome(list)) {
                count++;
            }
            removeStr(list, strB, i);
        }
        System.out.println(count);
    }
}

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        int len = str1.length();
        int n = 0;
        for (int i = 0; i <= len; i++) {
// 将字符串2插入到字符串1的每个位置,再判断是否是回文
            StringBuffer str = new StringBuffer(str1);
            str.insert(i, str2);
//注意这里,不能直接StringBuilder str5 = str.reverse();
//因为这样str本身又变了。
            StringBuilder tmp = new StringBuilder(str);
            StringBuilder str5 = tmp.reverse();
            if (str.toString().equals(str5.toString())) {
                n++;
            }
        } 
        System.out.println(n);
    }
}

 


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊爱吃软糖吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值