[编程题] 回文串 java 蘑菇街2016研发工程师在线编程题


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

输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于10。


输出描述:
输出答案(YES\NO).
示例1

输入

coco

输出

YES

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String str = sc.next();
			char[] chs = str.toCharArray();
			System.out.println(sovle(chs));
		}
		sc.close();
	}

	/**
	 * 使用双指针实现
	 * 
	 * @param chs
	 * @return
	 */
	private static String sovle(char[] chs) {
		int start = 0;
		int end = chs.length - 1;
		String res = "YES";
		while (start <= end) {
			if (chs[start] == chs[end]) {
				++start;
				--end;
				// 相当于删除后面的元素(在前面插入一个元素)
			} else if (chs[start] == chs[end - 1]) {
				--end;
			} else if (chs[start + 1] == chs[end]) {
				++start;
			} else {
				res = "NO";
				// 注意
				break;
			}
		}
		return res;
	}
}


在其它地方看到一种思路:既然能通过增加一个字符变成回文串,那一定也可以通过删除一个字符变成回文串。用一个循环,每次循环依次删掉一个字符,然后检查新串是否是回文串,看起来简单方便许多。

for (int i = 0; i < strlen(s); i++) {
    strcpy(tmp, s);
    for (int j = i; j < strlen(s); j++)
         tmp[j] = tmp[j+1]; // 删掉tmp[j],把后面的向前移动
    if (tmp is 回文串)
         return true;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值