5. longest palindromic substring
題目:找到乙個字串中最長的回文子串
思路:遍歷字串,看以下兩種情況得到的子串是不是回文
1)?+目前最長子字串長度的字串+當前字元——是回文則最長子字串長度+2
2)目前最長子字串長度的字串+當前字元——是回文則最長子字串長度+1
判斷是否回文需要注意start和end是否在字串長度外
public class solution
else if(ispalindrome(s,i-current,i))
}return ret;
}public boolean ispalindrome(string s,int start,int end)
}return true;
}}
516. longest palindromic subsequence
題目:找到最長回文子串的長度(不連續)
思路:動態規劃——建立二維動態規劃陣列dp,分別存i到j子串的最長回文長度。對角線dp[i][i]均為1,對角線坐下角矩陣均為0,右上角矩陣從下到上慢慢擴散,最後計算出dp[0][s.length()-1]為輸出結果。
public class solution
else}}
return dp[0][s.length()-1];
}}
214. shortest palindrome
題目:在輸入字串前加入最少字元,使其成為乙個回文串。
思路:暴力解法——從後往前看子串是否為回文串,是跳出將後面子串反序補到前面,實現沒有問題,但是時間複雜度太高。
public class solution
}if(max == s.length()) return s;
stringbuffer sb = new stringbuffer(s.substring(max, s.length()));
return sb.reverse().tostring()+s;
}public boolean ispalindrome(string s)
return (x == rev)||(x == rev/10);
}}
234. palindrome linked list
題目:判斷乙個單向鍊錶是不是回文,要求o(n)時間複雜度和o(1)空間複雜度
思路:two pointers——分為三步,第一,找到鍊錶的中間節點,第二,反轉後半部分鍊錶,第三,比較前半部分鍊錶和反轉後的後半部分鍊錶是否回文。這裡在找中間節點的時候用到了快慢指標,遍歷一次即可,以前喜歡先算出鍊錶長度,再除2得到中間節點,這個毛病要改掉。
反轉鍊錶的過程想複雜了,簡單過程如下:
對於1 -> 2,新建pre節點,取null
(1)1 -> 2
| |head節點 next節點
(2)pre <- 12
(3)pre <- 1
2 |
|pre節點 head節點
head為空時跳出迴圈。
/**
* definition for singly-linked list.
* public class listnode
* }*/public class solution
if(fast != null)
listnode pre = null;
while(slow != null)
slow = pre;
fast = head;
while(slow != null)
return true;
}}
LeetCode 驗證回文字串
給定乙個非空字串s,最多刪除乙個字元。判斷是否能成為回文字串。示例 1 輸入 aba 輸出 true 示例 2 輸入 abca 輸出 true 解釋 你可以刪除c字元。注意 字串只包含從 a z 的小寫字母。字串的最大長度是50000。思路 雙指標 當不相等的時候 左指標跳過乙個或者右指標跳過乙個 ...
Leetcode 驗證回文字串。
給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫 說明 本題中,我們將空字串定義為有效的回文串 1.先將字串變為小寫,因為本題忽略了字母的大小寫。2.利用字元的ascii值進行驗證 3.採用雙指標的辦法,乙個指向頭,乙個指向尾,同時向中間靠攏,過程中兩指標指向目標不相等則...
驗證回文字串 leetcode
給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。示例 1 輸入 a man,a plan,a canal panama 輸出 true 示例 2 輸入 race a car 輸出 false c 版本 class solut...