题目:
“回文串”是一个正读和反读都一样的字符串,比如“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
解题思路:
- 判断回文:这里我们首先将用户输入的字符串变为一个个的char,一个指针从开头向后遍历每个char的同时另一个指针从后向前遍历,当发现字符不相等时说明不是回文串
- 查找插入位置:知道如何判断回文后我们只需要将第二个字符串从第一个字符串第一个位置开始尝试插入直到判断回文的方法返回true时即找到插入位置
注意:莫要踩坑,身边许多小伙伴最初解这道题,寻找字符串的插入位置时,认为将StringA遍历一遍即可,但是这样相当于少计算了一次StringA最后一位字符的后面位置,因此导致不能通过全部测试用例,然而这种坑也特别隐蔽,十分难找,希望看到这条博客的小伙伴可以避免踩坑.
测坑代码如下:
未考虑到最后一个字符的后面位置
for (int i = 0;i < stringA.length();i++) {
//保证循环每次进来stringA值不变
StringBuilder sb = new StringBuilder(stringA);
//向stringA的分别不同位置插入stringB
sb.insert(i,stringB);
if (isHuiWen(stringA.toString())) {
count++;
}
}
System.out.println(count);
输出:
正确代码如下:
public class Main {
//先写一个方法来判断是否是回文串的方法
public static boolean isHuiWen(String string) {
int i = 0;
int j = string.length()-1;
while (i < j) {
if (string.charAt(i) != string.charAt(j)) {
return false;
}
i++;
j--;
}
return true;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String stringA = input.nextLine();
String stringB = input.nextLine();
//记录回文串的个数
int count = 0;
//注意:此处的判断条件万万不可是i<stringA.length(),这样会少计算字符串最后一个字符的后面位置
for (int i = 0;i <= stringA.length();i++) {
//保证循环每次进来stringA值不变
StringBuilder sb = new StringBuilder(stringA);
//向stringA的分别不同位置插入stringB
sb.insert(i,stringB);
if (isHuiWen(stringA.toString())) {
count++;
}
}
System.out.println(count);
}
}
如果有帮到各位小伙伴,留个赞支持一下吧!!!