首頁 > 後端開發 > C++ > 透過顛倒所有回文單字的出現順序來修改句子

透過顛倒所有回文單字的出現順序來修改句子

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2023-08-27 10:01:12
轉載
752 人瀏覽過

透過顛倒所有回文單字的出現順序來修改句子

問題陳述

我們給了一個字串 str,總共包含 N 個字。我們需要找到給定字串中的所有回文單詞,並透過反轉所有回文單字的順序來創建一個新字串。

範例

輸入

str = ‘nayan was gone to navjivan eye hospital’
登入後複製

輸出

‘eye was gone to navjivan nayan hospital’
登入後複製

說明

此字串包含三個回文字:nayan、navjivan 和 eye。我們顛倒了所有三個單字的順序,並保持所有其他單字相同。

輸入

‘Hello, users! How are you?’
登入後複製
登入後複製

輸出

‘Hello, users! How are you?’
登入後複製
登入後複製

說明

它提供相同的輸出,因為字串不包含任何回文單字。

輸入

‘Your eye is beautiful.’
登入後複製
登入後複製

輸出

‘Your eye is beautiful.’
登入後複製
登入後複製

說明

它提供與僅包含單一回文單字的字串相同的輸出。

方法 1

在這種方法中,我們首先將字串拆分為單字。之後,我們將過濾所有回文詞。接下來,我們反轉所有回文詞的順序。

最後,我們遍歷字串,如果當前單字是回文單詞,我們將用另一個回文單字以相反的順序替換它。

演算法

  • 步驟 1 - 透過傳遞一個字串作為傳回結果字串的參數來執行reversePlaindromic()函數。

  • 第 2 步 - 建立 isPalindrome() 函數,用於檢查單字是否為回文。

  • 步驟 2.1 - 將「start」初始化為 0,將「end」初始化為字串長度 – 1。

  • 步驟 2.2 - 使用 while 循環遍歷字串,比較第一個和最後一個字符,比較第二個和倒數第二個字符,依此類推。如果任何字元不匹配,則傳回 false,因為它不是回文字串。

  • 步驟 2.3 - 如果字串是回文,則傳回 true。

  • 第 3 步 - 建立一個向量來儲存字串的單字。另外,定義「temp」變數來儲存該單字。

  • 步驟 4 - 使用 for 迴圈遍歷字串,如果不等於空格 (‘ ’),則將字元附加到臨時值。否則,將 temp 的值推送到 allWords 向量。

  • 步驟 5 - 迭代 allWords 向量並使用 isPalindrome() 函數檢查目前單字是否為回文。如果是,則將該單字推入「palindromWords」向量。

  • 第 6 步 - 反轉「palindromWords」清單。

  • 第 7 步 - 現在,再次迭代「allWords」向量,並檢查目前單字是否是回文。如果是,請將其替換為「palindromWords」清單中受尊重的單字。

  • 第 8 步 - 迭代「palindromWords」列表,並透過將所有單字附加到結果變數來建立一個字串。傳回結果字串。

範例

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Function to check if a string is a palindrome
bool isPalindrome(string str){
   int start = 0;
   int end = str.length() - 1;
   // iterate till start < end
   while (start < end){
      // check if the character at the start and end are not the same and return false, else increment start and decrement end
      if (str[start] != str[end]){
         return false;
      } else {
         start++;
         end--;
      }
   }
   return true;
}
string reversePalindromic(string str) {
   // vectors to store all words and palindromic words
   vector<string> palindromWords;
   vector<string> allWords;
   // variable to store single word
   string temp = "";
   for (char x : str) {
      // If the current character is not space, then append it to temp; else, add temp to palindrome words and make temp NULL
      if (x != ' ') {
         temp += x;
      } else {
         allWords.push_back(temp);
         temp = "";
      }
   }
   // push the last word to all words
   allWords.push_back(temp);
   // fetch all palindromic words
   for (string x : allWords){
      if (isPalindrome(x)){
         // Update newlist
         palindromWords.push_back(x);
      }
   }
   // Reverse the vector
   reverse(palindromWords.begin(), palindromWords.end());
   int k = 0;
   for (int i = 0; i < allWords.size(); i++){
      // If the current word is a palindrome, push it to palindrome words
      if (isPalindrome(allWords[i])){
         allWords[i] = palindromWords[k];
         k++;
      }
   }
   string result = "";
   for (string x : allWords) {
      result += x;
      result += " ";
   }
   return result;
}
int main(){
   string str = "nayan was gone to navjivan eye hospital";
   string reverse = reversePalindromic(str);
   cout << reverse << endl;
   return 0;
}
登入後複製

輸出

eye was gone to navjivan nayan hospital
登入後複製
  • 時間複雜度 - O(N),因為我們迭代長度為 N 的字串。

  • 空間複雜度 - O(K),因為我們使用列表來儲存單字,其中 k 是字串中的單字總數。

結論

我們學會了從句子中獲取所有回文單字並以相反的順序添加它們。在上面的程式碼中,程式設計師可以嘗試更改 isPalindrome() 函數的實作來學習新的東西。

以上是透過顛倒所有回文單字的出現順序來修改句子的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板