给定一个字符串,问是否能通过添加一个字母将其变为回文串。
Posted todayjust
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定一个字符串,问是否能通过添加一个字母将其变为回文串。相关的知识,希望对你有一定的参考价值。
输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于10。*/
//好的思路,减去一个字母,判断是否为回文
public class addCharhuiwen { public static boolean isHuiWen(String s) { int n = s.length(); for (int i = 0; i < n / 2; i++) { if (s.charAt(i) != s.charAt(n - i - 1)) { return false; } } return true; } public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { String s = in.next(); if (isHuiWen(s) == true) System.out.println("YES"); else { if (s.length() % 2 == 0) {// 偶数位,添一个字母变成奇数个 考虑以中间偏左的点作为中心, // 比较俩侧的值,若有俩次不同,则不构成回文,一次不同可以 int lmid = s.length() / 2 - 1; int rmid = s.length() / 2; int flag = 0, flag2 = 0; for (int i = 0, k = 0; i < s.length() / 2;) {// 以中心左侧的点为轴 if (lmid - i - 1 < 0) break; if (lmid - i - 1 >= 0 && s.charAt(lmid - i - 1) == s.charAt(lmid + k + 1)) { i++; k++; continue; } else { flag++; k++; if (flag > 1) { flag = 2; break; } } } for (int i = 0, k = 0; i < s.length() / 2;) {// 以右侧点为轴 if (rmid + k + 1 >= s.length()) break; if (rmid + k + 1 < s.length() && s.charAt(rmid - i - 1) == s.charAt(rmid + k + 1)) { i++; k++; continue; } else { flag2++; i++; if (flag2 > 1) { flag2 = 2; break; } } } if (flag <= 1 || flag2 <= 1) { System.out.println("YES"); } else { System.out.println("NO"); } } else {// 奇数位 int flag = 0; int l = 0;// 左相等bccab int r = 0;// 右相等baccb boolean b = true; int mid = s.length() / 2; for (int i = 0, k = 0; i < s.length() / 2;) { if (mid - i - 1 < 0 || mid + k + 1 >= s.length()) { break; } if (mid - i - 1 >= 0 && s.charAt(mid - i - 1) == s.charAt(mid) && s.charAt(mid) == s.charAt(mid + k + 1)) {// baccccb的情况 i++; k++; } else { // 直到mid左右的值不等于mid的值 baccb的情况 // 这里只执行一次 if (b) { if (s.charAt(mid - i - 1) == s.charAt(mid)) {// 左边相等bccab i++; l = 1; } else if (s.charAt(mid + k + 1) == s.charAt(mid)) {// 右边相等baccb k++; r = 1; } else {// 不能成回文 flag = 2; break; } b = false; } } if (s.charAt(mid - i - 1) == s.charAt(mid + k + 1)) { i++; k++; } else { flag++; if (flag >= 2) break; if (l == 1) { k++; } if (r == 1) { i++; } } } if (flag <= 1) { System.out.println("YES"); } else { System.out.println("NO"); } } } } }// while in.hasNext() }
以上是关于给定一个字符串,问是否能通过添加一个字母将其变为回文串。的主要内容,如果未能解决你的问题,请参考以下文章
给定一个英文句子(一个只有字母的字符串),将句中所有单词变为有且只有首字母大写
译密码。为使电文保密,往往按一定规律将其转换成密码,受保人再按约定的规律将其翻译回原文。A变E ,a变e,W,X,Y,Z分别变为A,B,C,D小写字母以此类推