我的思路是找出所有的子串然后,去判断是否是回文的
这样的时间复杂度是O(N^3)
class Solution {
int count = 0;
public int countSubstrings(String s) {
//挨个判断是否是回文子串
for(int i = 0;i < s.length();i++){
for(int j = i+1;j <= s.length();j++){
String s1 = s.substring(i,j);
//System.out.println(s1);
if(isPari(s1)){
count++;
}
}
}
return count;
}
public boolean isPari(String s){
if(s.length() < 1){
return false;
}
for(int i = 0;i < s.length();i++){
if(s.charAt(i) != s.charAt(s.length()-1-i)){
return false;
}
}
return true;
}
}
别人的思路是把每个字符作为中心,去依次向外扩张,来计算个数,时间复杂度是O(N^2)
class Solution {
int count = 0;
//时间复杂度是O(N^2),最优解是马拉车算法,时间复杂度是O(N)
public int countSubstrings(String s) {
//挨个判断是否是回文子串//根本不用回溯,遍历即可
for(int i = 0;i < s.length();i++){
isPari(s,i,i);//判断以当前字符为中心,向外扩散,奇数
isPari(s,i,i+1);//判断以当前字符为中心,偶数
}
return count;
}
public void isPari(String s,int i,int j){
while(i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)){
count++;
i--;
j++;
}
}
}
本道题最优的解法应该是马拉车算法,马拉车算法致力于找出最长的回文子串,时间复杂度是O(N),以后有时间再来补充吧,可以去看官方题解