回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
- 输入:“abc”
- 输出:3
- 解释:三个回文子串: “a”, “b”, “c”
示例 2: - 输入:“aaa”
- 输出:6
- 解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
提示:输入的字符串长度不会超过 1000 。
class Solution {
public int countSubstrings(String s) {
int result = 0;
for (int i = 0; i < s.length(); i++) {
result += extend(s, i, i, s.length()); // 以i为中心
result += extend(s, i, i + 1, s.length()); // 以i和i+1为中心
}
return result;
}
public int extend(String s, int i, int j, int n) {
int res = 0;
while (i >= 0 && j < n && s.charAt(i) == s.charAt(j)) {
i--;
j++;
res++;
}
return res;
}
}
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
- 输入:s = “babad”
- 输出:“bab”
- 解释:“aba” 同样是符合题意的答案。
示例 2: - 输入:s = “cbbd”
- 输出:“bb”
示例 3: - 输入:s = “a”
- 输出:“a”
示例 4: - 输入:s = “ac”
- 输出:“a”
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) {
return "";
}
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
public int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
--left;
++right;
}
return right - left - 1;
}
}