c语言判断字符串是不是回文_LeetCode 热题 HOT 100 5. 最长回文子串
生活随笔
收集整理的這篇文章主要介紹了
c语言判断字符串是不是回文_LeetCode 热题 HOT 100 5. 最长回文子串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
題解
暴力法
我們根據回文字符串特點進行判斷一個字符串是不是回文。
// 回文子串:首尾對稱相等const isPalindrome = s => { // abba aba for (let i = 0; i < Math.floor(s.length / 2); i++) { if (s[i] !== s[s.length - 1 - i]) { return false } } return true}/** * @param {string} s * @return {string} */var longestPalindrome = function(s) { let answer = '' if (s.length <= 1) return s[0] || '' for (let i = 0; i < s.length - 1; i++) { for (let j = i + 1; j <= s.length; j++) { curStr = s.substring(i, j) if (curStr.length > answer.length && isPalindrome(curStr)) { answer = curStr } } } return answer};動態規劃
?一個回文字符串 abdba 去掉首尾后仍是回文 bdb?由此推導狀態轉移方程 dp?dp[i][j] 表示 s.substring(i, j+1) 這樣一個字符串是不是回文字符串?dp[i][j] = (s[i] === s[j]) && dp[i+1][j-1]?dp[i+1][j-1] 即就表示去掉首位字符后?我們還需要考慮一個特殊情況 類似 a ab aba 肯定存在回文串 即 j - i <= 2?動態規劃就是充分利用之前緩存的計算結果,快速推倒出一個字符串是不是一個回問文串?動態規劃也是典型的 空間換時間的一種思路
/** * @param {string} s * @return {string} */var longestPalindrome = function(s) { const len = s.length let answer = '' const dp = Array.from(new Array(len), () => new Array(len).fill(false)) // 此處可以省略 base state 初始化 dp[i][j] = true for (let i = len - 1; i >= 0; i--) { for (let j = i; j < len; j++) { // 狀態轉移方程 dp[i][j] = (s[i] === s[j]) && (j - i <= 2 || dp[i+1][j-1]) // 更新最長子串 if (dp[i][j]) { console.log(s.substring(i, j + 1)) } if (dp[i][j] && (j - i >= answer.length)) { answer = s.substring(i, j + 1) } } }// console.log(dp) return answer};推薦閱讀
?告別動態規劃,連刷 40 道題,我總結了這些套路,看不懂你打我(萬字長文)[1]?如何理解動態規劃?[2]
ps: 歡迎關注我的公眾號 xyz編程日記,覺得不錯的幫忙點個?,點個在看。
References
[1]?告別動態規劃,連刷 40 道題,我總結了這些套路,看不懂你打我(萬字長文):?https://zhuanlan.zhihu.com/p/91582909[2]?如何理解動態規劃?:?https://www.zhihu.com/question/39948290
總結
以上是生活随笔為你收集整理的c语言判断字符串是不是回文_LeetCode 热题 HOT 100 5. 最长回文子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svchost.exe是什么进程?svc
- 下一篇: 买数字货币亏惨了!美图浮亏超3亿 净亏损