用 C++ 編寫一個程式,將兩個字串分割成迴文串


如果一個字串在反轉後保持不變,則稱該字串為迴文串。

在這個特定的問題中,我們得到了兩個相同長度的字串 'a' 和 'b'。如果它們用某些索引進行分割,那麼任務就是檢查字串的和是否構成迴文串。

假設我們有兩個長度為 '4' 的字串 'a' 和 'b',並且在索引 '3' 處分割這兩個字串,使得:

                 aaa | bbbb | a

aaa(第一個字串的字首)+ a(第二個字串的字尾)應該是迴文串

或者

b(第一個字串的字尾)+ bbb(第二個字串的字首)應該是迴文串

例如

輸入-1:

a = “abcdef”

b = “fedcba”

輸出

True

說明:在索引 '2' 處分割字串 'a' 和字串 'b' 後,它們將變為:

abc | def 和 fed | cba

這樣 abc(第一個字串的字首)+ cba(第二個字串的字尾)就構成了一個迴文串。因此,我們將返回“True”。

輸入-2:

a =  “eatable”

b =  “tableau”

輸出

False

說明:沒有辦法將這兩個字串組合成迴文串。

解決此問題的方法

為了解決這個問題,我們將使用雙指標方法。在這種方法中,首先,我們將初始化兩個指標,low 和 high,使得 low 指向 '0',high 指向字串的最後一個字元。

由於兩個字串的長度相等,我們將檢查它們是否都少於 2 個字元。如果是,則返回 True。否則,我們將使用指標迭代整個字串,進行遞迴檢查。如果兩個字串相等,則返回 True,否則返回 False。

  • 獲取兩個字串,分別為 'a' 和 'b'。
  • 布林函式 checkPalindromic(string a, string b) 以兩個字串作為輸入引數,並根據情況返回 True 或 False。
  • 初始化兩個指標,low 和 high,其中 low = 0,high = 字串 'b' 的長度。
  • 遍歷字串並檢查兩個字串的字元是否相等。
  • 布林函式 split(string a, string b) 獲取兩個字串,如果它們是迴文串,則返回 True,否則返回 False。

示例

線上演示

#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(string a, int low, int high) {
   while (low < high) {
      if (a[low] != a[high])
         return false;
      low++;
      high--;
   }
   return true;
}
bool Split(string a, string b) {
   int low = 0;
   int high = b.size() - 1;
   while (low < high and a[low] == b[high]) {
      low++;
      high--;
   }
   return isPalindrome(a, low, high) || isPalindrome(b, low, high);
}
bool checkPalindromic(string a, string b) {
   if (a.size() < 2)
      return true;
   return Split(a, b) || Split(b, a);
}
int main() {
   string a = "abcpqr";
   string b = "mnocba";
   if (checkPalindromic(a, b)) {
      cout << "True" << endl;
   } else {
      cout << "False" << endl;
   }
   return 0;
}

執行以上程式碼將生成以下輸出:

輸出

True

說明:如果我們將給定的字串 'abcpqr' 和 'mnocba' 在索引 '2' 處分割,使得:

a(字首) = abc 和 b(字尾) = cba

a(字尾) = pqr 和 b(字首) = mno

我們可以觀察到 a(字首) + b(字尾) 構成了一個迴文串,因此輸出為 True。

更新於: 2021 年 2 月 23 日

235 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告