Java: How to create the shortest palindrome of a string by inserting the minimum number of characters?
我目前有以下实现,它通过插入最少数量的字符来处理给定字符串的最短回文,但只处理前面的字符插入以创建最短回文。
但是通过以下实现,或者如果有更好的实现,我该如何在字符串中的任何点插入字符以使其成为回文?
将接受并投票赞成答案。谢谢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Answer { public String findShortestPalindrome(String s) { int len = s.length(); if (len <= 1) { return s; } int i = len - 1; for (; i >= 0; --i) { if (stringIsPalindrome(s, 0, i)) { break; } } StringBuilder sb = new StringBuilder(s.substring(i + 1)); sb.reverse().append(s); return sb.toString(); } public boolean stringIsPalindrome(String s, int start, int end) { while (start < end) { if (s.charAt(start) != s.charAt(end)) { return false; } start++; end--; } return true; } } |
差异
寻找处理插入字符串中任意点的最短回文。
你可以试试这个解决方案。这应该有效!
1 2 3 4 5 6 7 8 9 10 11 | public boolean stringIsPalindrome(String s, int start, int end) { String str1 = s.substring(0,Math.floor((end-start)/2)); String str2 = s.substring(Math.floor((end-start)/2),end); str2 = reverseString(str2); return str1.equals(str2); } public String reverseString(String s) { //YOUR REVERSE STRING METHOD } |
你可以实现以下蛮力算法:
如果 first 和 last 不一样,那么你有两个选择:
1 2 | left = last + palindromed(input without last) + last or right = first + palindromed(input without first) + first |
所以在这一步你选择最短的解决方案