C++程序:计算字符串在最小分割次数后的回文数量


假设我们有一个小写字符串s,我们必须将其分割成尽可能少的字符串,使得每个字符串都是回文,然后找到字符串的数量。

因此,如果输入类似于s = "levelracecar",则输出将为2,因为有两个回文"level"和"racecar"。

为了解决这个问题,我们将遵循以下步骤:

  • n := A的长度

  • 定义一个大小为(n + 1)的数组result

  • result[n] := -1

  • for i := n - 1 to 0 (递减):

    • result[i] := n - i - 1

    • for j := i to n (递增):

      • 如果A从i到j - i的子串是回文,则:

        • result[i] := min(result[i], 1 + result[j + 1])

  • return result[0] + 1

示例

让我们看看下面的实现以更好地理解:

在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool isPalindrome(string A) {
      int left = 0;
      int right = A.size() - 1;
      while (left < right) {
         if (A[left] != A[right]) {
            return 0;
         }
         left++;
         right--;
      }
      return 1;
   }
   int solve(string A) {
      int n = A.size();
      vector<int> result(n + 1);
      result[n] = -1;
      for (int i = n - 1; i >= 0; i--) {
         result[i] = n - i - 1;
         for (int j = i; j < n; j++) {
            if (isPalindrome(A.substr(i, j - i + 1))) {
               result[i] = min(result[i], 1 + result[j + 1]);
            }
         }
      }
      return result[0] + 1;
   }
};
int solve(string s) {
   return (new Solution())->solve(s);
}
int main(){
   string s = "levelracecar";
   cout << solve(s);
}

输入

"levelracecar"

输出

2

更新于:2020年12月23日

116次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告