java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846 |
---|
解题思路 |
---|
- 直接使用中心扩展法即可。
- 对于其它方法,LeetCode第5题都有涉及
🏆LeetCode5:最长回文子串https://blog.youkuaiyun.com/grd_java/article/details/124666706 |
---|
中心扩展法 |
---|
- 对于不同的回文串,它的中心可能是1个字符,或者2个字符
- 例如abccba这样的字符串是回文串,以两个字符cc为中心
- abcccba这样的是以一个字符c为中心的回文串
- 所以我们可以从头到尾遍历字符串。然后每一次都考虑,两个字符为中心,和一个字符为中心,这两种情况来构建回文串。
- 确定中心后,只需要使用贪心的思想,不断扩展的比较两边。当前两边只要相等,那么整个字符串就是回文串。
- 例如abc
c
cba。我们先拿到了c- 然后向两边扩展比较,ab
c
cc
ba。我们发现两边相等。那么ccc就是一个回文串- 再次向两边扩展a
b
cccb
a,两边再次相等,那么bcccb就是一个回文串- 再次向两边扩展
a
bcccba
两边再次相等,那么abcccba就是一个回文串
代码 |
---|
class Solution {
/**
中心拓展回文串法,时间复杂度O(n^2).空间复杂度O(1)
我们要统计所有回文串的个数,
*/
public int countSubstrings(String s) {
int n = s.length(), ans = 0;//n为字符串长度,ans保存有几种回文串
char c[] = s.toCharArray();//转换为char数组
//中心扩展法经典步骤
for(int i = 0; i < n;i++){//从左到右依次选择字符作为中心
//找到以i位置字符为中间的回文串。abcccba以c为中心的回文串
ans += expandAroundCenter(c,i,i);//处理1个字符作为中心的回文串
//找到以i和i+1位置为中心的回文字符串。例如abccba这样的字符串是回文串,cc为中心
ans += expandAroundCenter(c,i,i+1);//处理2个字符作为中心的回文串
}
return ans;
}
//找到回文串的核心逻辑,不断进行两边的扩展比较。
private int expandAroundCenter(char[] c,int i, int j){
int count = 0;//回文串个数
while(i >= 0 && j < c.length && c[i]==c[j]){//如果满足回文串
i--;j++;//继续判断
count++;//每个回文串都记录
}
return count;
}
}