5.无重复字符的最长子串

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

1
2
3
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

1
2
输入:s = "cbbd"
输出:"bb"

示例 3:

1
2
输入:s = "a"
输出:"a"

示例 4:

1
2
输入:s = "ac"
输出:"a"

暴力破解方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function (s) {
let len = s.length;
let max = 0;
let result = "";
for (let i = 0; i < len; i++) {
for (let j = i + 1; j <= len; j++) {
let str = s.slice(i, j);
if (str.length > max && isPalindromic(str)) {
max = str.length;
result = str;
}
}
}
return result;
};

var isPalindromic = function (s) {
for (let i = 0; i < s.length / 2; i++) {
if (s[i] !== s[s.length - 1 - i]) {
return false;
}
}
return true;
};

最长公共子串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function (s) {
let arr = [];
let reverse = s.split("").reverse().join("");
let maxLen = 0;
let maxEnd = 0;
for (let i = 0; i < s.length; i++) {
arr[i] = [];
for (let j = 0; j < reverse.length; j++) {
if (s[i] === reverse[j]) {
if (i === 0 || j == 0) {
arr[i][j] = 1;
} else {
arr[i][j] = arr[i - 1][j - 1] + 1;
}
if (arr[i][j] > maxLen) {
let beforeRev = s.length - 1 - j;
//判断下标是否对应
if (beforeRev + arr[i][j] - 1 === i) {
maxLen = arr[i][j];
maxEnd = i;
}
}
} else {
arr[i][j] = 0;
}
}
}
return s.slice(maxEnd + 1 - maxLen, maxEnd + 1);
};