C++程序中检查子串[L…R]是否为回文


在这个问题中,我们给定一个字符串str,Q个查询,每个查询包含两个值L和R,用于子串[L...R]。我们的任务是创建一个程序来解决查询,以检查子串[L…R]是否为回文。

问题描述 − 为了解决每个查询,我们需要检查L到R范围内的子串是否为回文。

让我们举个例子来理解这个问题:

输入

str = “abccbeba” , Q = 3
Query[][] = {{1, 4}, {0, 6}, {4, 6}}

输出

Palindrome
Not Palindrome
Palindrome

解释

Creating all substring for the given
substrings : Substring[1...4] = “bccb”, it is a palindrome
Substring[0...6] = “abccbeb”, it is a not palindrome
Substring[4...6] = “beb”, it is a palindrome

解决方案

解决这个问题的一个简单方法是解决每个查询。为此,我们需要找到从索引范围L到R的子串。并检查子串是否为回文。

程序说明了我们解决方案的工作原理:

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
int isPallindrome(string str){
   int i, length;
   int flag = 0;
   length = str.length();
   for(i=0;i < length ;i++){
      if(str[i] != str[length-i-1]) {
         flag = 1; break;
      }
   }
   if (flag==1)
      return 1;
      return 0;
   }
   void solveAllQueries(string str, int Q, int query[][2]){
      for(int i = 0; i < Q; i++){ isPallindrome(str.substr(query[i][0] - 1, query[i][1] -       1))?cout<<"Palindrome\n":cout<<"Not palindrome!\n";
   }
}
int main() {
   string str = "abccbeba"; int Q = 3;
   int query[Q][2] = {{1, 3}, {2, 5}, {4, 5}};
   solveAllQueries(str, Q, query);
   return 0;
}

输出

Palindrome
Not palindrome!
Palindrome

这是一个朴素的方法,但效率不高。

解决这个问题的一个有效方法是使用动态规划方法。为了解决这个问题,我们需要创建一个DP数组,一个二维数组,存储布尔值,表示子串[i...j]是否为回文,用于DP[i][j]。

我们将创建这个DP矩阵,并检查每个查询的所有L-R值。

程序说明了我们解决方案的工作原理:

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
void computeDP(int DP[][50], string str){
   int length = str.size();
   int i, j;
   for (i = 0; i < length; i++) {
      for (j = 0; j < length; j++)
      DP[i][j] = 0;
   }
   for (j = 1; j <= length; j++) {
      for (i = 0; i <= length - j; i++) {
         if (j <= 2) {
            if (str[i] == str[i + j - 1])
            DP[i][i + j - 1] = 1;
         }
         else if (str[i] == str[i + j - 1])
         DP[i][i + j - 1] = DP[i + 1][i + j - 2];
      }
   }
}
void solveAllQueries(string str, int Q, int query[][2]){
   int DP[50][50];
   computeDP(DP, str);
   for(int i = 0; i < Q; i++){
      DP[query[i][0] - 1][query[i][1] - 1]?cout<<"not    palindrome!\n":cout<<"palindrome!\n";
   }
}
int main() {
   string str = "abccbeba"; int Q = 3;
   int query[Q][2] = {{1, 3}, {2, 5}, {4, 5}};
   solveAllQueries(str, Q, query);
   return 0;
}

输出

palindrome!
not palindrome!
palindrome!

更新于:2020年12月22日

440 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告