LeetCode – Shortest Palindrome (Java)

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".

Java Solution 1

public String shortestPalindrome(String s) {
    int i=0; 
    int j=s.length()-1;
 
    while(j>=0){
        if(s.charAt(i)==s.charAt(j)){
            i++;
        }
        j--;
    }
 
    if(i==s.length())
        return s;
 
    String suffix = s.substring(i);
    String prefix = new StringBuilder(suffix).reverse().toString();
    String mid = shortestPalindrome(s.substring(0, i));
    return prefix+mid+suffix;
}

Java Solution 2

We can solve this problem by using one of the methods which is used to solve the longest palindrome substring problem.

Specifically, we can start from the center and scan two sides. If read the left boundary, then the shortest palindrome is identified.

public String shortestPalindrome(String s) {
	if (s == null || s.length() <= 1)
		return s;
 
	String result = null;
 
	int len = s.length();
	int mid = len / 2;	
 
	for (int i = mid; i >= 1; i--) {
		if (s.charAt(i) == s.charAt(i - 1)) {
			if ((result = scanFromCenter(s, i - 1, i)) != null)
				return result;
		} else {
			if ((result = scanFromCenter(s, i - 1, i - 1)) != null)
				return result;
		}
	}
 
	return result;
}
 
private String scanFromCenter(String s, int l, int r) {
	int i = 1;
 
	//scan from center to both sides
	for (; l - i >= 0; i++) {
		if (s.charAt(l - i) != s.charAt(r + i))
			break;
	}
 
	//if not end at the beginning of s, return null 
	if (l - i >= 0)
		return null;
 
	StringBuilder sb = new StringBuilder(s.substring(r + i));
	sb.reverse();
 
	return sb.append(s).toString();
}
Category >> Algorithms >> Interview  
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
<pre><code> 
String foo = "bar";
</code></pre>

  1. Ying Zhang on 2015-6-9

    given “baaabc” generated “cbaaabaaabc” Should be “cbaaabc” instead?

  2. Aswin Gokul on 2015-6-15

    Is this DP?

  3. Xiaoguang Huo on 2015-7-2

    this solution is not correct..
    Submission Result: Wrong AnswerMore Details
    Input:”aba”
    Output:”ababa”
    Expected:”aba”

  4. vinay on 2015-7-3

    Above program is wrong for some of the testcases such as aaabcbaa.check this program it works for all the testcases….

    import java.util.*;
    class makepalindrome
    {
    public static void main(String args[])
    {
    Scanner sc = new Scanner(System.in);
    System.out.println(“Enter a String to process”);
    String s = sc.nextLine();
    String s1 = makepalin1(s,s.length()-1,0);
    String s2 = makepalin2(s,s.length()-1,0);
    //The String with the shortest length is printed
    System.out.println(s1.length()>s2.length()?s2:s1);
    sc.close();
    }
    public static String makepalin1(String s, int count, int pos)
    {
    //System.out.println(s + ” count: ” + count + “pos: ” + pos);

    if(count <= 0)
    return s;
    else

    if(s.charAt(count) != s.charAt(pos))
    return s.charAt(count) + makepalin1(s.substring(pos, count),count-1,pos) + s.charAt(count)

    else
    return s.charAt(pos) + makepalin1(s.substring(pos+1, count),count-2,pos) +s.charAt(pos);
    }

    public static String makepalin2(String s, int count, int pos)
    {
    //System.out.println(s + " count: " + count + "pos: " + pos);

    if(count <= 0)
    return s;
    else
    if(s.charAt(count) != s.charAt(pos))
    return s.charAt(pos) + makepalin2(s.substring(pos+1, count+1),count-1,pos) + s.charAt(pos);

    else
    return s.charAt(pos) + makepalin2(s.substring(pos+1, count),count-2,pos) +s.charAt(pos);
    }
    }

  5. Alvin Wei on 2015-9-9

    Following change can pass the online verification.

    public class Solution {
    public String shortestPalindrome(String s) {
    if (s == null || s.length() =0; i--) {
    if (s.charAt(i) == s.charAt(i+1)) {
    if ((result = scan(s, i, i+1)) != null) {
    return result;
    }
    }
    if ((result = scan(s, i, i)) != null) {
    return result;
    }
    }

    return result;
    }

    String scan (String s, int l, int r) {
    int i = 1;
    for (; l-i>=0&&r+i=0) return null;

    StringBuilder sb = new StringBuilder(s.substring(r+i));
    sb.reverse();
    return sb.append(s).toString();
    }
    }

  6. xxooing on 2015-11-19


    public static String shortestPalindrome(String s) {
    StringBuilder result = new StringBuilder();
    int i = s.length() - 1;
    int j = 0;

    while (i > j) {
    if (s.charAt(i) == s.charAt(j)) {
    i--;
    j++;
    }
    else {
    result.append(s.charAt(i));
    i--;
    }
    }
    return result.append(s).toString();
    }

  7. ryanlr on 2016-5-10

    This solution is wrong.

  8. geetha on 2016-6-24

    In Java Solution 1, String mid = shortestPalindrome(s.substring(0, i)); should be String mid = s.substring(0, i);

  9. imleo on 2016-10-2

    This solution could work?

    public String shortestPalindrome(String input){
    StringBuilder preff = new StringBuilder();
    StringBuilder suff = new StringBuilder();

    Stack stack = new Stack();

    stack.addAll(Arrays.asList( input.split(“”)));
    String lastElement;
    while(!stack.isEmpty()){
    if( stack.size() == 1 ){
    preff.append(stack.firstElement());
    stack.clear();
    continue;
    }

    lastElement = stack.pop();

    preff.append(lastElement);
    suff.insert(0, lastElement);

    if(lastElement.equals(stack.firstElement())){
    stack.remove(0);
    }
    }

    return preff.toString() + suff.toString();
    };

  10. Kshama Dalal on 2017-2-21

    Can also return ‘prefix + S’ in 1st solution

Leave a comment

*