(Java)LeetCode-214. Shortest Palindrome

Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.

For example:

Given "aacecaaa", return "aaacecaaa".

Given "abcd", return "dcbabcd".



这道题是hard模式,做出来了当然很开心,击败了70%多的人~

首先我想的是判断 包括首字母在内的最长的回文子串,然后再在前面加上 后面非回文子串的 逆序 ,就形成了最短的回文串了,从整个字符串开始判断,然后每一次去掉最后一个字符,这个思路是没错的,就是会导致超时,因为那个测试用例是上千个A,中间加了CD两个字母,变态啊。

于是我就想了一种改进方法,判断回文的时候是从两边到中间(两个指针left right),依次比较字符是否相等,isPalindrome(String str)函数返回一个数字,代表下一次要判断是否是回文串的长度(从首字母开始)、思路是这样的,当匹配失败时,判断一下right位置的那个字符在前面已匹配过的字符串中有没有出现过,没有出现过的话就直接从这个right左边再继续判断是否回文串,出现过就按部就班的缩短一位继续判断,神奇的是这样一个简单的改动从超时直接到超过70%的人,amazing~

在百度里搜了下别人的思路,也没有什么厉害的,就是某个地方用了下KMP算法,就酱紫吧~


public String shortestPalindrome(String s) {        
		int len = s.length();
		int right = len;
		while(right > 1){
			String str = s.substring(0,right);
			int temp = isPalindrome(str);
			if(temp == 0){
				
				break;
			}else{
				right = temp;
			}
		}
		StringBuilder strbu = new StringBuilder("");
		while(right<len){
			strbu.append(s.charAt(len-1));
			len--;
		}
		return strbu.toString()+s;
    }
	
	private int isPalindrome(String s){
		int left = 0;
		int right = s.length()-1;
		while(left <= right){
			if(s.charAt(left) == s.charAt(right)){
				left++;
				right--;
			}else{
				int index = s.indexOf(s.charAt(right));
				if( index == -1 || index > left){
					return right;
				}else{
					return s.length()-1;
				}
			}
				
		}
		return 0;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值