【题目描述】
给你一个字符串 s
,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
https://leetcode.cn/problems/palindromic-substrings/?favorite=2cktkvj
【示例】
【代码】泪雨潇虹
学习参考:中心扩展法
package com.company;
import java.util.*;
// 2022-02-08
class Solution {
public int countSubstrings(String s) {
int num = 0;
int n = s.length();
for (int i = 0; i < n; i++){ // 遍历回文中心点
for (int j = 0; j <= 1; j++){ // j=0,中心是一个点,j=1,中心是两个点; 如果3个数则可能回文了
int l = i;
int r = j + i;
while (l >= 0 && r < n && s.charAt(l--) == s.charAt(r++)) num++;
}
}
// System.out.println(num);
return num;
}
}
public class Test {
public static void main(String[] args) {
new Solution().countSubstrings( "abc"); // 输出:3 解释:三个回文子串: "a", "b", "c
new Solution().countSubstrings( "aaa"); // 输出:6 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
}
}
【代码】admin
通过率 128/130 超时了,代码可用
思路: 基于双指针来实现的, 判断字符是否符合回文的特性
package com.company;
import java.util.*;
// 2022-02-08
class Solution {
List<String> list = new LinkedList<>();
public int countSubstrings(String s) {
if (s.length() == 1) return s.length();
for (int i = 0; i < s.length(); i++){
int start = i;
int end = s.length();
while (start < end){
String tmp = s.substring(start, end);
if (huiwei(tmp)){
list.add(tmp);
}
end--;
}
}
System.out.println(list);
return list.size();
}
private boolean huiwei(String s){
StringBuilder sb = new StringBuilder(s);
if (s.equals(sb.reverse().toString())) return true;
return false;
}
}
public class Test {
public static void main(String[] args) {
new Solution().countSubstrings( "abc"); // 输出:3 解释:三个回文子串: "a", "b", "c
new Solution().countSubstrings( "aaa"); // 输出:6 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
}
}