返回
HOT100之最长回文子串(JavaScript版)
前端
2023-09-26 22:33:32
HOT100——最长回文子串(JS实现)
引言
在计算机科学中,回文子串是指在一个字符串中出现的连续字符序列,它们从左向右读和从右向左读都相同。例如,在字符串“abba”中,“abba”和“bb”都是回文子串。
寻找最长回文子串是一个经典的字符串处理问题,在许多实际应用中都有广泛的使用,例如:文本处理、模式匹配、数据压缩等。本文将详细讲解如何使用JavaScript来寻找一个字符串中的最长回文子串。
解题思路
在解决这个问题时,我们可以采用中心扩散法。中心扩散法的核心思想是:对于一个给定的字符,我们以它为中心向左右两边扩展,同时比较左右两边的字符是否相等。如果它们相等,我们就继续向外扩展,直到找到不相等的字符为止。这样,我们就找到了一个以给定字符为中心的回文子串。
方法:中心扩散法
/**
* 寻找字符串中的最长回文子串
* @param {string} str 字符串
* @return {string} 最长回文子串
*/
function longestPalindrome(str) {
if (str === null || str.length === 0) {
return "";
}
let start = 0;
let end = 0;
let maxLength = 0;
// 循环遍历字符串
for (let i = 0; i < str.length; i++) {
// 考虑奇数长度的回文子串
let oddLength = expandAroundCenter(str, i, i);
if (oddLength > maxLength) {
start = i - Math.floor(oddLength / 2);
end = i + Math.floor(oddLength / 2);
maxLength = oddLength;
}
// 考虑偶数长度的回文子串
let evenLength = expandAroundCenter(str, i, i + 1);
if (evenLength > maxLength) {
start = i - Math.floor(evenLength / 2) + 1;
end = i + Math.floor(evenLength / 2);
maxLength = evenLength;
}
}
// 返回最长回文子串
return str.substring(start, end + 1);
}
/**
* 扩展回文子串的中心
* @param {string} str 字符串
* @param {number} left 左边界
* @param {number} right 右边界
* @return {number} 回文子串的长度
*/
function expandAroundCenter(str, left, right) {
// 循环扩展回文子串的中心
while (left >= 0 && right < str.length && str[left] === str[right]) {
left--;
right++;
}
// 返回回文子串的长度
return right - left - 1;
}
具体思路请看代码注释。
结束语
在本文中,我们介绍了如何使用JavaScript来寻找一个字符串中的最长回文子串。我们使用中心扩散法来解决这个问题,并提供了详细的代码实现。我们还讨论了两种情况:回文子串的长度是奇数和偶数。希望这篇文章对您有所帮助。