?LeetCode刷題實(shí)戰(zhàn)214:最短回文串
You are given a string s. You can convert s to a palindrome by adding characters in front of it.
Return the shortest palindrome you can find by performing this transformation.
題意
示例
示例 1:
輸入:s = "aacecaaa"
輸出:"aaacecaaa"
示例 2:
輸入:s = "abcd"
輸出:"dcbabcd"
提示:
0 <= s.length <= 5 * 104
s 僅由小寫英文字母組成
解題
思路一:暴力破解法
class Solution {
public String shortestPalindrome(String s) {
int index = -1;
for(int i = s.length() - 1; i >= 0; i--){
if(isPalindrome(s.substring(0, i + 1))){
index = i;
break;
}
}
String result = reverse(s.substring(index + 1));
return result + s;
}
private String reverse(String s){
StringBuilder stringBuilder = new StringBuilder(s);
return stringBuilder.reverse().toString();
}
private boolean isPalindrome(String s){
for(int i = 0; i < s.length() / 2; i++){
if(s.charAt(i) != s.charAt(s.length() - 1 - i)){
return false;
}
}
return true;
}
}
class Solution {
public String shortestPalindrome(String s) {
int i = 0;
for(int j = s.length() - 1; j >= 0; j--){
if(s.charAt(j) == s.charAt(i)){
i++;
}
}
if(i == s.length()){
return s;
}
return reverse(s.substring(i)) + shortestPalindrome(s.substring(0, i)) + s.substring(i);
}
private String reverse(String s){
StringBuilder stringBuilder = new StringBuilder(s);
return stringBuilder.reverse().toString();
}
}
class Solution {
public String shortestPalindrome(String s) {
String rev = reverse(s);
String temp = s + "#" + rev;
int[] next = getNext(temp);
return rev.substring(0, rev.length() - next[temp.length() - 1]) + s;
}
private String reverse(String s){
StringBuilder stringBuilder = new StringBuilder(s);
return stringBuilder.reverse().toString();
}
private int[] getNext(String s){
int[] result = new int[s.length()];
result[0] = 0;
for(int i = 1; i < result.length; i++){
int temp = result[i - 1];
while(temp > 0 && s.charAt(i) != s.charAt(temp)){
temp = result[temp - 1];
}
if(s.charAt(i) == s.charAt(temp)){
temp++;
}
result[i] = temp;
}
return result;
}
}
LeetCode1-200題匯總,希望對(duì)你有點(diǎn)幫助!
LeetCode刷題實(shí)戰(zhàn)201:數(shù)字范圍按位與
LeetCode刷題實(shí)戰(zhàn)202:快樂(lè)數(shù)
LeetCode刷題實(shí)戰(zhàn)203:移除鏈表元素
LeetCode刷題實(shí)戰(zhàn)204:計(jì)數(shù)質(zhì)數(shù)
LeetCode刷題實(shí)戰(zhàn)205:同構(gòu)字符串
LeetCode刷題實(shí)戰(zhàn)206:反轉(zhuǎn)鏈表
LeetCode刷題實(shí)戰(zhàn)207:課程表
LeetCode刷題實(shí)戰(zhàn)208:實(shí)現(xiàn) Trie (前綴樹(shù))
LeetCode刷題實(shí)戰(zhàn)209:長(zhǎng)度最小的子數(shù)組
LeetCode刷題實(shí)戰(zhàn)210:課程表 II
LeetCode刷題實(shí)戰(zhàn)211:添加與搜索單詞
LeetCode刷題實(shí)戰(zhàn)212:?jiǎn)卧~搜索 II
LeetCode刷題實(shí)戰(zhàn)213:打家劫舍 II
評(píng)論
圖片
表情
