思路
代码已上传)https://gitee.com/Aoyuan-210902/SuanFaDemo/tree/master/src/仓库,需要测试实例和其他题型解决,可以去自行浏览
重要概念
子字符串 是字符串中的由连续字符组成的一个序列。
回文字符串 是正着读和倒过来读一样的字符串
解题方法
我们根据定义可知,回文字符串是正着读和倒过来读一样的字符串,所以我们可以固定一个定值作为标杆,当这个标杆左右的元素相等,这个元素就符合条件。
我们可以看到,当这个标杆到d元素时,左右指针分别是c,c,在递增一次,分别是b,b所以我们可以使用这种方法来遍历字符串拿到符合条件的就回文字符串,需要注意的是,d元素自己本身也是回文字符串,所以我们在循环判断时,不能忽略到字符本身的情况
另外,我们注意到回文字符串有单数个元素,或者双数个元素的情况
前面的介绍是单数个得情况,最后返回的回文字符子串长度都是1,3,5这类奇数个
如果
我们可以看到这种情况的回文字符子串会有cc,bccb这种偶数个的情况。所以我们也要考虑到这一类的问题,那我们要怎么解决呢?
把上面说到的标杆元素设置成连续的两个不就好啦!
代码(为了方便测试,代码加入了展示回文字符串的集合,需要提交的可以把集合去掉就可以啦)
后面也有提交版喔
package huiwenzifuchuan;
import java.util.ArrayList;
import java.util.List;
/**
* 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
*
* 回文字符串 是正着读和倒过来读一样的字符串。
*
* 子字符串 是字符串中的由连续字符组成的一个序列。
*
* 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
*
*
*
* 示例 1:
*
* 输入:s = "abc"
* 输出:3
* 解释:三个回文子串: "a", "b", "c"
* 示例 2:
*
* 输入:s = "aaa"
* 输出:6
* 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
*/
public class My647 {
public int countSubstrings(String s) {
if (s == null || s.isEmpty()) {
return 0;
}
int count = 0;
List<String> palindromes = new ArrayList<>(); // 保存回文子串
for (int i = 0; i < s.length(); i++) {
count += judgeHuiWen(s, i, i, palindromes); // 回文中心是一个字符
count += judgeHuiWen(s, i, i + 1, palindromes); // 回文中心是两个字符
}
System.out.println("回文子串为:" + palindromes);
return count;
}
public int judgeHuiWen(String s, int begin, int end, List<String> palindromes) {
int count = 0;
while (begin >= 0 && end < s.length() && s.charAt(begin) == s.charAt(end)) {
count++;
palindromes.add(s.substring(begin, end + 1)); // 将回文子串加入列表
begin--;
end++;
}
return count;
}
public static void main(String[] args) {
My647 my647 = new My647();
int aa = my647.countSubstrings("aacbcaa");
System.out.println("回文子串数量为:" + aa);
}
}
提交版
class Solution {
public int countSubstrings(String s) {
if (s == null || s.isEmpty()) {
return 0;
}
int count = 0;
for (int i = 0; i < s.length(); i++) {
count += judgeHuiWen(s, i, i); // 回文中心是一个字符
count += judgeHuiWen(s, i, i + 1); // 回文中心是两个字符
}
return count;
}
public int judgeHuiWen(String s, int begin, int end) {
int count = 0;
while (begin >= 0 && end < s.length() && s.charAt(begin) == s.charAt(end)) {
count++;
begin--;
end++;
}
return count;
}
}