將字串 Str1 轉換為 Str2,方法是將 B 向右移動,將 A 向左移動,且兩者不能交叉。


本文旨在實現一個程式,透過將 B 向右移動,將 A 向左移動,且兩者不交叉的方式,將字串 Str1 轉換為 Str2。

眾所周知,在 C 程式設計中,字串是一組以空字元“\0”結尾的字元。C 字串中的字元儲存在字元陣列中。C 字串與字元陣列的區別在於它以獨特的字元“\0”結尾。

示例

Let us take the input strings, str1 = “#B#A#”, and str2 = “##BA#”
Output obtained here is: Yes

說明 − 'B' 單步向右移動一個空格。因此字串變為“##BA#”,這與最終的 s2 字串相同。

示例

Let us take the input strings, str1 = “#A#B#”, and str2 = “#B#A#”
Output obtained here is : Yes

問題陳述

實現一個程式,透過將 B 向右移動,將 A 向左移動,且兩者不交叉的方式,將字串 Str1 轉換為 Str2。

方法

根據以上觀察,解決問題的思路如下:

當字串滿足要求時,機器人可以移動到最終位置。

由於不允許 A 和 B 交叉,因此在刪除空空格 '#' 後,兩個字串應該相同。

如果在從兩個字串中刪除 '#' 後,s2 中 'A' 的位置與 s1 中不同,'B' 的位置也與 s1 中不同。

演算法

以下是將字串 S1 轉換為 S2(透過將 B 向右移動,將 A 向左移動,且兩者不交叉)的程式演算法:

  • 步驟 1 − 實現一個函式來檢查機器人是否可以移動。

  • 步驟 2 − 定義陣列 a1 和 a2,用於儲存不包含 '#' 的字串 str1 和 str2。

  • 步驟 3 − 檢查第一個條件:字串 s1 和 s2 必須完全匹配,沒有任何間隙。

  • 步驟 4 − 'A' 和 'B' 在 str1 和 str2 中的相對位置分別儲存在 v1 和 v2 中。

  • 步驟 5 − 檢查條件 2:字串 str1 中 'A' 的位置和字串 str2 中 'B' 的位置應該大於或等於彼此,並且 'A' 和 'B' 的位置應該小於或等於彼此。

  • 步驟 6 − 列印結果作為輸出。

示例(C 程式)

以下是上述演算法的 C 程式實現,用於透過將 B 向右移動,將 A 向左移動,且兩者不交叉的方式,將字串 S1 轉換為 S2。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

bool moveRobots(char str1[], char str2[]) {
   char a1[100], a2[100];
   int a1Index = 0, a2Index = 0;
   for (int i = 0; str1[i] != '\0'; i++) {
      if (str1[i] != '#')
         a1[a1Index++] = str1[i];
   }
   a1[a1Index] = '\0';
   for (int i = 0; str2[i] != '\0'; i++) {
      if (str2[i] != '#')
         a2[a2Index++] = str2[i];
   }
   a2[a2Index] = '\0';
   if (strcmp(a1, a2) == 0) {
      int n = strlen(a1);
      int v1[100], v2[100];
      int v1Index = 0, v2Index = 0;
      for (int i = 0; str1[i] != '\0'; i++) {
         if (str1[i] != '#')
            v1[v1Index++] = i;
      }
      for (int i = 0; str2[i] != '\0'; i++) {
         if (str2[i] != '#')
            v2[v2Index++] = i;
      }
      if (a1[0] == 'A' && v1[0] < v2[0])
         return false;
      if (a1[0] == 'B' && v1[0] > v2[0])
         return false;
      for (int i = 1; i < n; i++) {
         if (a1[i] == 'A') {
            if (v1[i] < v2[i])
               return false;
         } else {
            if (v1[i] > v2[i])
               return false;
         }
      }
      return true;
   }
   return false;
}
int main() {
   char str1[] = "#B#A#";
   char str2[] = "##BA#";
   if (moveRobots(str1, str2))
      printf("Yes
"); else printf("No
"); return 0; }

輸出

執行後,將產生以下輸出:

Yes

結論

同樣,我們可以透過將 B 向右移動,將 A 向左移動,且兩者不交叉的方式,將字串 S1 轉換為 S2。本文解決了實現將字串 S1 轉換為 S2(透過將 B 向右移動,將 A 向左移動,且兩者不交叉)的程式的難題。

本文提供了 C 程式設計程式碼以及實現將字串 S1 轉換為 S2(透過將 B 向右移動,將 A 向左移動,且兩者不交叉)的程式的演算法和方法。

更新於:2023年10月31日

127 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告