(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 left){
					return right;
				}else{
					return s.length()-1;
				}
			}
				
		}
		return 0;
	}


你可能感兴趣的:(JAVA,LeetCode)