给定一个字符串,问是否能通过添加一个字母将其变为回文串。

输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于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()
}
时间: 2024-08-09 10:32:07

给定一个字符串,问是否能通过添加一个字母将其变为回文串。的相关文章

添加字符判断是否为回文串

题目:给定一个字符串,问是否能通过添加一个字母将其变为回文串. 提要:所有代码皆为C++语言. 看到题,首先想到如何判断回文串 注:回文串添加或删除指定字符一定还是回文串. 对于一个字符串,从左右两端开始,以此判断,直到读取超出字符串中间. 代码如下: #include<iostream> #include<string.h> using namespace std; bool JudgeReverseString(char *str) { //对比对应位置字符是否相同 int l

最长(大)回文串的查找(字符串中找出最长的回文串)PHP实现

首先还是先解释一下什么是回文串:就是从左到右或者从右到左读,都是同样的字符串.比如:上海自来水来自海上,bob等等. 那么什么又是找出最长回文串呢? 例如:字符串abcdefedcfggggggfc,其中efe,defed,cdefedc,gg,ggg,gggg,ggggg,gggggg,fggggggf,cfggggggfc都是回文串,左右完全一样. 这其中,有最短的gg,最长的cfggggggfc,还有其他长度的.忽略长度为1的.毕竟一个字符的都算回文了. 那么,找出最长的,就是找出这个cf

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。

思路:回文串的特点是,逆序输出和正序输出是一样的.所以这道题可以从这方面来考虑.如果将此字符串逆序输出,那么两个字符串的最长公共子序列将是最长的回文字符串,那么剩余的值将是要删除的字符个数. 求LCS的方法可以在csdn中找到. import java.util.*; public class Main{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); while(scan.hasNex

判断一个字符串里是否包含了另一个字符串

NSString *str1 = @"comeontom哈哈回复好 sad 分身乏术的发烧发烧的"; NSString *str2 = @"comeontom"; if ([str1 rangeOfString:str2].location != NSNotFound) { NSLog(@"str1包含str2"); }else{ NSLog(@"str1不包含str2"); } 判断一个字符串里是否包含了另一个字符串

黑马程序员——java——模拟一个字符串中的trim方法去掉一个字符串两端的空格

模拟一个字符串中的trim方法去掉一个字符串两端的空格 public class StingTrimDemo { //模拟一个trim方法, 去掉一个字符串两边的空格], public static void main(String[] args) { // TODO Auto-generated method stub String s = " my java "; System.out.println("未去空格前的字符串+++:[ "+s+" ]&q

求一个字符串中的最长回文串(Java)

package huiwenchuan; import java.util.Scanner; public class Main { //判断一个字符串是否为回文串 public static boolean isHuiWen(String s) { int len=s.length(); for(int i=0;i<len/2;i++) { if(!(s.charAt(i)==s.charAt(len-i-1))) { return false; } } return true; } /**

添加回文串

题目描述 对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串. 给定原字符串A及它的长度n,请返回添加的字符串.保证原串不是回文串. 测试样例: "ab",2 返回:"a" 问题分解 1.找到最长的回文子串 2.剩余部分就是需要添加的子串 使用Naive查找,寻找最大公共串 这里用到了:翻转子串==原子串 =>回文子串 从原串的开头开始找,比较是否与翻转串的末尾相同 [这里用到了本题

UVA - 11584 划分字符串的回文串子串; 简单dp

/** 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34398 UVA - 11584 划分字符串的回文串子串: 简单dp 题目大意: 给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串.问最少可以分割成多少个. 定义:dp[i]表示前0~i内的字符串划分成的最小回文串个数: dp[i] = min(dp[j]+1 | j+1~i是回文串); 先预处理flag[i][j]表示以i~j内的字符串为回文串

leetcode.字符串.125验证回文串-Java

1. 具体题目 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写.说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false 2. 思路分析 对于给定的字符串,其中可能包括有无效字符,所以需要先将原字符串中的无效字符去掉(用正则表达式判断),得到新字符串后用双指针比较首尾字符是否