目录
一、原题再现
二、问题分析
三、完整代码
一、原题再现
统计回文_牛客题霸_牛客网
描述
“回文串”是一个正读和反读都一样的字符串,比如“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); } }