基於給定條件,獲取空字串時移除字元的索引之和


字串操作相關的概念,例如獲取空字串時刪除字元的索引之和,經常用於程式設計挑戰和競賽中。結果透過計算被刪除字元的索引之和來計算。

獲取空字串時刪除字元的索引之和是字串操作中一個實用的概念,可以用來解決各種程式設計問題和挑戰。

問題方法

為了找到獲取空字串時刪除字元索引的總和,我們首先需要理解問題陳述和給定的條件。

給定字串 S,目標是確定可以從 S 中刪除的字元總數,同時仍然留下一個空字串。例如,如果 S = "code",則可以刪除位置 0、4、5 和 6 處的字元以獲得空字串。這些索引加起來為 0 + 4 + 5 + 6 = 15。

然而,使用棧是解決此問題的常用策略。我們可以遍歷字元字串 S,並確定在每次迭代中是否可以刪除每個字元。如果可以刪除它,我們可以將其索引新增到棧中。如果無法刪除它,我們可以檢視棧頂部的字元是否可以與當前字元一起刪除。如果可以刪除它,我們將執行此操作並將它的索引與當前字元的索引一起新增到總和中。此過程可以重複,直到處理完字串中的所有字元。

以下虛擬碼說明了此策略 -

stack = []
sum = 0
for k in range(len(S)):
   if stack and S[k] == S[stack[-1]]:
      stack.pop()
      sum += k + stack[-1] if stack else k
   else:
      stack.append(k)
return sum

在此虛擬碼中,sum 變數和一個空棧都初始化為 0。然後使用 for 迴圈反覆遍歷字串 S。檢查每個字元,以檢視它是否可以與棧頂部的字元一起刪除,以及棧是否不為空。如果可以執行此操作,則從棧中刪除該字元,並將它的索引和正在處理的字元的索引新增到 sum 變數中。在這種情況下,我們將它的索引新增到棧中並嘗試刪除它。然後我們返回 sum 變數。

此方法的時間和空間複雜度均為 O(n),其中 n 是字串 S 的長度,n 是可以從 S 中刪除的最大字元數。

語法

以下是如何使用 C++ 語法確定根據指定條件建立空字串時刪除的字元索引總數 -

解釋

  • 我們首先獲取使用者輸入的字串。

  • 我們將 n 的初始值設定為字串 str 的長度。

  • 接下來,我們將 cnt 初始化為 0,它將計算字元 "U" 的出現次數。

  • 我們將 sum 的初始值設定為 0,它將儲存刪除的字元索引的總數。

  • 之後,我們迴圈遍歷 str,檢查每個字元如下 -

    • 如果字元是 "U",我們增加 cnt 並將 sum 增加 (n - i - 1) + 2 * cnt。

    • 如果字元不是 "U",我們透過新增 i + 2 * cnt 來增加 sum。

  • 最後,我們輸出 sum 的值。

注意 - 因為問題中沒有明確說明此問題的具體條件,所以假設使用了這些條件。

{
   string str;
   cin >> str;

   int n = str.size();
   int cnt = 0, sum = 0;
   for (int k = 0; i < n; k++) {
      if (str[k] == 'U') {
         sum += (n - k - 1) + 2 * cnt;
         cnt++;
      } else {
         sum += k + 2 * cnt;
      }
   }
   cout << sum << endl;
}

演算法

一個 C++ 演算法,用於在定義的條件下計算獲取空字串時刪除的字元索引總數 -

  • 步驟 1 - 首先,定義一個字串變數並輸入使用者提供的字串。

  • 步驟 2 - 建立一個棧來儲存字串的字元。

  • 步驟 3 - 逐個字元迴圈遍歷輸入字串。

  • 步驟 4 - 如果棧為空,則將當前字元壓入棧中。

  • 步驟 5 - 如果當前字元和棧頂字元相同,則從棧中彈出棧頂字元。

  • 步驟 6 - 如果當前字元與棧頂字元不同,則將當前字元壓入棧中。

  • 步驟 7 - 迴圈結束後,只有不能刪除的字元會保留在棧中。

  • 步驟 8 - 將仍然在棧中的字元的索引加起來。

  • 步驟 9 - 顯示索引的總和。

遵循的方法

方法 1

使用以下條件計算獲取空字串時字元刪除索引的總和 -

在此示例中,字串 "abacbdc" 用作輸入。程式碼使用兩個索引 i 和 j 從頭到尾遍歷字串。從字串中刪除字元的條件如下

如果 s[i] 和 s[j] 相等,則將兩個索引都移到字串的中心。

  • 如果 s[i] 小於 s[j],則刪除索引 j 處的字元並將索引的總和增加索引 i+1。

  • 如果 s[i] 大於 s[j],則刪除索引 i 處的字元並將索引的總和增加索引 j+1。

刪除所有字元後,索引的總和將報告到控制檯。

請記住,這只是一個說明,並且根據問題的性質,字元刪除的條件可能會發生變化。

示例 1

#include <iostream>
#include <string>

using namespace std;

int main() {
   string s = "abacbdc";
   int sum = 0;
   int i = 0;
   int j = s.length() - 1;
   while (i < j) {
      if (s[i] == s[j]) {
         i++;
         j--;
      } else if (s[i] < s[j]) {
         sum += i + 1;
         i++;
         s.erase(j, 1);
         j--;
      } else {
         sum += j + 1;
         j--;
         s.erase(i, 1);
         i++;
      }
   }
   cout << "Sum of indices of characters removed: " << sum << endl;
   return 0;
}

輸出

Sum of indices of characters removed: 6

方法 2

sum_of_indices 函式的輸入是字串 str 和字元 c。然後,透過遍歷字串,它確定每個字元是否等於 c。如果是,則該函式遞減迴圈索引以考慮已刪除的字元,並在使用 erase 方法從字串中刪除字元之前將字元的索引新增到執行總和中。然後,該函式返回已刪除字元索引的總數。

在 main 函式中定義了示例字串 str 和字元 c,這兩個輸入用於呼叫 sum_of_indices 函式。結果,總和將列印到控制檯。

示例 2

#include <iostream>
#include <string>
using namespace std;
int sum_of_indices(string str, char c) {
   int sum = 0;
   for (int i = 0; i < str.length(); i++) {
      if (str[i] == c) {
         sum += i;
         str.erase(i, 1);
         i--;
      }
   }
   return sum;
}
int main() {
   string str = "abcbcdc";
   char c = 'c';
   int sum = sum_of_indices(str, c);
   cout << "Sum of indices of characters removed to obtain empty string: " << sum << endl;
   return 0;
}

輸出

Sum of indices of characters removed to obtain empty string: 9

結論

根據提供的條件,計算獲取空字串時已刪除字元索引的總和的問題需要操作字串及其索引。為了解決此問題,迴圈遍歷字串,如果兩個連續的字元相同,則在更新索引之前刪除它們。一旦我們得到一個,我們就可以將已刪除以生成空字串的字元的索引加起來。

此問題有多種解決方案,例如使用棧或佇列來跟蹤要刪除的字元,或者使用遞迴來迭代地從字串中刪除字元。

更新於: 2023年5月10日

100 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告