日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在本教程中,我們需要解決給定字符串的回文子串查詢。解決回文子串查詢比解決 C++ 中的常規查詢復雜得多。它需要更復雜的代碼和邏輯。

在本教程中,我們提供了字符串 str 和 Q 個子字符串 [L…R] 查詢,每個查詢都有兩個值 L 和 R。我們的目標編寫一個程序來解決查詢以確定 substring[L…R] 是否是回文。我們必須確定在 L 到 R 范圍內形成的子串是否是回文來解決每個查詢。例如 –

Let's input "abbbabaaaba" as our input string.
The queries were [3, 13], [3, 11], [5, 8], [8, 12]
It is necessary to determine whether the substring is a plaindrome
A palindrome is "abaaabaaaba" (3, 13) .
It is not possible to write "baaa" as a palindrome [3, 11].
As in [5, 8]: "aaab" cannot be a palindrome.
There is a palindrome in "baaab" ([3, 12]).

登錄后復制

求解的方法

樸素方法

這里,我們必須通過檢查子字符串是否在索引范圍 L 到 R 之間來查找回文因此,我們需要對所有的子串查詢進行一一檢查,判斷是否是回文。由于有 Q 個查詢,每個查詢需要 0(N) 時間來回答。最壞情況下需要 0(Q.N) 時間。

示例

#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] = {{3, 5}, {5, 7}, {2, 1}};
   solveAllQueries(str, Q, query);
   return 0;
}

登錄后復制

輸出

Palindrome
Palindrome
Not palindrome!

登錄后復制

動態規劃方法

使用動態規劃方法來解決問題是一種有效的選擇。為了解決這個問題,我們需要創建一個 DP 數組,它是一個二維數組,其中包含一個布爾值,指示 substring[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] = {{3, 5}, {5, 7}, {2, 1}};
   solveAllQueries(str, Q, query);
   return 0;
}

登錄后復制

輸出

palindrome!
not palindrome!
palindrome!

登錄后復制

結論

在本教程中,我們學習了如何使用 C++ 代碼解決回文子串查詢。我們還可以用java、python和其他語言編寫這段代碼。這段代碼是最復雜、最冗長的代碼之一。回文查詢比常規子串查詢更難,并且需要非常準確的邏輯。我們希望本教程對您有所幫助。

以上就是回文子字符串查詢在C++中的詳細內容,更多請關注www.xfxf.net其它相關文章!

分享到:
標簽:回文 子字符串 查詢
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定