N字形变换 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。之后,你的输出需要从左往右逐行读取,产生出一个新的字符串。(如果你看Z字形的排列,会发现字符的添加方式是按行向下,然后是对角线向上,如此循环直到字符串的所有字符都被添加到对应的行上。)
例如:s = "PAYPALISHIRING" 和 numRows = 4 如下图所示
画出 这个直观的视图后 ,一个直接的想法便是 将整个字符串遍历 再将每一个 字符放到对应的行里,然后到 给定的最后一行后(如,例子中给定的第四行)要调转方向向回走,直到 最后一个字符。
var func = function getMethod(s,numRows){
if(s.length==1) return s;
//初始化一个数组;c创建一个 长度为 numRows和s.length中最小值的 空字符的数组。
connst rows = Array(Math.min(numRows,s.length)).fill('');
let cutRows = 0; //初始化字符的下标
let goingDown = false;//是否触底反转。
for(let char of s){
rows[cutRows]+=char; //将遍历的字符 按照规则放到对应的行
//若 到了Math.min(numRows,s.length)行后 需要调转方向 (在这里 转换为了对应的 数组的下标)
if(cutRows == 0 || cutRows = numRows-1) goingDown = !goingDown;
//向下为+1 斜向上为-1
cutRows+=goingDown?1:-1;
}
return rows.join('');
}
最长回文子串 给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。输入:s = "cbbd"输出:"bb"。
中心扩展法
function longestPalindrome(s) {
// 初始化与基本检查:首先,我们检查字符串s是否存在,或者其长度是否小于2。如果满足这些条件,那么整个字符串s自身就是最长的回文子串
if (!s || s.length < 2) {
return s;
}
// 初始化最长回文子串
let maxStr = '';
// 定义辅助函数expand;这个函数尝试从给定的left和right索引向外扩展以找到最长的回文子串。循环的条件保证了我们不会越过字符串的边界,并且当前子串仍然是回文。函数返回找到的回文子串(left是左边的边界而right则是右边的边界 而s[left] === s[right]这个条件则表示 在中心向两端扩散的时候 满足此条件 则是回文)
const expand = (left, right) => {
while (left >= 0 && right < s.length && s[left] === s[right]) {
left--;
right++;
}
return s.slice(left + 1, right);
};
// 主循环;这里,我们遍历字符串s中的每一个字符。对于每个字符,我们调用expand函数两次:一次是以当前字符为中心来找奇数长度的回文;另一次是以当前字符及其后面的字符为中心来找偶数长度的回文。之后,我们检查找到的回文子串str1和str2的长度,与当前maxStr的长度进行比较,如果更长,则更新maxStr。
for (let i = 0; i < s.length; i++) {
let str1 = expand(i, i); // 试图找到奇数长度的回文
let str2 = expand(i, i + 1); // 试图找到偶数长度的回文
if (str1.length > maxStr.length) {
maxStr = str1;
}
if (str2.length > maxStr.length) {
maxStr = str2;
}
}
return maxStr;
}