当前位置:   article > 正文

LeetCode-020.回文子字符串的个数_回文串的个数leetcode

回文串的个数leetcode

  • 1 <= s.length <= 1000
  • s 由小写英文字母组成

 

  1. class Solution {
  2. public int countSubstrings(String s) {
  3. //是回文,right++;不是,left++
  4. int count=0;
  5. int left=0;
  6. while (left<s.length()) {
  7. int right=left;
  8. while (right<s.length()){
  9. if(isPalindrome(s,left,right)){
  10. count++;
  11. }
  12. right++;
  13. }
  14. left++;
  15. }
  16. return count;
  17. }
  18. private boolean isPalindrome(String s, int start, int end) {
  19. while (start<end){
  20. if(s.charAt(start)!=s.charAt(end)){
  21. return false;
  22. }
  23. start++;end--;
  24. }
  25. return true;
  26. }
  27. }

枚举出所有的回文子串的两种思路: 

  • 枚举出所有的子串,然后再判断这些子串是否是回文;

        O(n 2) 的时间枚举出所有的子串 s[l ⋯ r ],然后再用 O(r −l +1) 的时间检测当前的子串是否是回文,整个算法的时间复杂度是 O(n^3)。

  • 枚举每一个可能的回文中心,然后用两个指针分别向左右两边拓展,当两个指针指向的元素相同的时候就拓展,否则停止拓展

        枚举回文中心的是  O(n) 的,对于每个回文中心拓展的次数也是O(n) 的,所以时间复杂度是  O(n^2  ) 

  1. class Solution {
  2. public int countSubstrings(String s) {
  3. int n = s.length(), ans = 0;
  4. //长度为 n 的字符串会生成 2n−1 组回文中心
  5. for (int i = 0; i < 2 * n - 1; ++i) {
  6. int l = i / 2, r = i / 2 + i % 2;
  7. while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) {
  8. --l;
  9. ++r;
  10. ++ans;
  11. }
  12. }
  13. return ans;
  14. }
  15. }

3、Manacher 算法

有什么浅显易懂的Manacher Algorithm讲解? - 知乎 (zhihu.com)

  1. class Solution {
  2. public int countSubstrings(String s) {
  3. int n = s.length();
  4. StringBuffer t = new StringBuffer("$#");
  5. for (int i = 0; i < n; ++i) {
  6. t.append(s.charAt(i));
  7. t.append('#');
  8. }
  9. n = t.length();
  10. t.append('!');
  11. int[] f = new int[n];
  12. int iMax = 0, rMax = 0, ans = 0;
  13. for (int i = 1; i < n; ++i) {
  14. // 初始化 f[i]
  15. f[i] = i <= rMax ? Math.min(rMax - i + 1, f[2 * iMax - i]) : 1;
  16. // 中心拓展
  17. while (t.charAt(i + f[i]) == t.charAt(i - f[i])) {
  18. ++f[i];
  19. }
  20. // 动态维护 iMax 和 rMax
  21. if (i + f[i] - 1 > rMax) {
  22. iMax = i;
  23. rMax = i + f[i] - 1;
  24. }
  25. // 统计答案, 当前贡献为 (f[i] - 1) / 2 上取整
  26. ans += f[i] / 2;
  27. }
  28. return ans;
  29. }
  30. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/799559
推荐阅读
相关标签
  

闽ICP备14008679号