通过交换给定字符或水平旋转 Q 查询来翻转字符串

data structurec++programming更新于 2025/4/30 22:22:17

通过交换给定字符或水平旋转 Q 查询来翻转字符串是一个有趣的问题,它涉及根据一系列查询来操作字符串。在本教程中,我们将深入研究这个问题并使用 C++ 提供解决方案。

问题陈述围绕一个字符串和一组查询展开,每个查询都包含交换特定字符或执行水平旋转的指令。我们的目标是在应用所有查询后确定字符串的最终配置。

通过本教程,我们将探索问题的复杂性,讨论 C++ 中的实现细节,并提供有效解决问题的分步指南。最后,读者将全面了解如何使用 C++ 编程解决类似的字符串操作挑战。那么,让我们深入翻转字符串的激动人心的世界,发现等待我们的优雅解决方案。

问题陈述

考虑一个长度为 2N 的字符串和一组由三个整数 T、A 和 B 表示的查询。每个查询类型 T 可以是 1 或 2。对于类型 1 查询,字符串中的第 A 个和第 B 个字符(使用基于 1 的索引)被交换,而对于类型 2 查询,前 N 个字符与后 N 个字符交换。目标是在应用所有查询后找到结果字符串。

让我们通过示例来理解这个问题陈述。

示例 1

输入

给定一个字符串"ABCD",N = 2,以及以下查询:{{2, 0, 0}, {1, 1, 3}, {2, 0, 0}}

输出

最终字符串为"CBAD"。

解释

1. 应用第一个查询(类型 2)得到字符串"CDAB"。

2.执行第二个查询(类型 1)会交换位置 1 和 3 处的字符,从而将字符串转换为"ADCB"。

3. 第三个查询(类型 2)会交换前 N 个字符与后 N 个字符,从而得到最终字符串"CBAD"。

示例 2

输入

考虑 N = 2 的字符串"LEAP"和查询:{{2, 0, 0}, {1, 1, 2}, {1, 2, 3}, {1, 3, 4}, {2, 0, 0}}

输出

The final string is "EAPL".

解释

1. 应用第一个查询(类型 2)不会修改字符串:"LEAP"。

2. 执行第二个查询(类型 1)会交换位置 1 和 2 处的字符,结果为"ELAP"。

3. 第三个查询(类型 1)会交换位置 2 和 3 处的字符,将字符串转换为"EALP"。

4. 执行第四个查询(类型 1)会交换位置 3 和 4 处的字符,结果为"EAPL"。

5.最后一个查询(类型 2)将前 N 个字符与后 N 个字符交换,使字符串保持不变:"EAPL"。

因此,在将所有查询应用于输入字符串"LEAP"后,最终字符串为"EAPL"。

算法

步骤 1. 定义函数"swapCharacters",根据给定字符串中的两个字符的索引交换它们。

步骤 2. 定义函数"rotateString",通过将前"N"个字符移动到字符串末尾,将给定字符串旋转"N"个位置。

步骤 3. 定义函数"applyQueries",以原始字符串、旋转值"N"和查询向量作为输入。

步骤 4. 将"modifiedString"初始化为原始字符串的副本。

步骤 5. 遍历向量中的每个查询查询。

  • 从当前查询中提取类型、"a"和"b"值。

  • 如果类型为 1,则调用"swapCharacters"在"modifiedString"中交换索引"a"和"b"处的字符。

  • 否则,调用"rotateString"将"modifiedString"旋转"N"个位置。

步骤 6. 返回修改后的字符串。

步骤 7. 在"main"函数中,初始化原始字符串"S"、旋转值"N"和查询向量。

步骤 8. 使用这些值调用"applyQueries"函数以获取修改后的字符串。

步骤 9. 将最终字符串打印为输出。

示例

使用 C++ 实现上述算法

下面的 C++ 程序获取字符串"S",并根据一组查询对其执行不同的操作。查询表示为向量的向量,其中每个内部向量包含三个元素:操作类型,以及表示要交换字符的索引"a"和"b"。程序将这些查询应用于字符串"S",并生成修改后的字符串作为输出。

输入

"ABCD"; N: 2; Queries: {{2, 0, 0}, {1, 1, 3}, {2, 0, 0}};

输出

Final String: "CBAD"

示例

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
void swapCharacters(std::string& str, int a, int b) {
   std::swap(str[a - 1], str[b - 1]);
}
void rotateString(std::string& str, int N) {
   int length = str.length();
   if (N <= 0 || N >= length)
      return;
   std::string temp = str.substr(0, N);
   str.erase(0, N);
   str += temp;
}
std::string applyQueries(const std::string& str, int N, const 
std::vector<std::vector<int>>& queries) {
   std::string modifiedString = str;
   for (const std::vector<int>& query : queries) {
      int type = query[0];
      int a = query[1];
      int b = query[2];
      if (type == 1) {
         swapCharacters(modifiedString, a, b);
      } else {
         rotateString(modifiedString, N);
      }
   }
   return modifiedString;
}
int main() {
   std::string S = "ABCD";
   int N = 2;
   std::vector<std::vector<int>> queries = {{2, 0, 0}, {1, 1, 3}, {2, 0, 0}};
   std::string result = applyQueries(S, N, queries);
   std::cout << "Final String: " << result << std::endl;
   return 0;
}

输出

Final String: CBAD

结论

总之,通过交换给定字符或水平旋转字符串来翻转 Q 查询的问题为字符串操作提供了一个有趣的练习。在本教程中,我们探讨了问题陈述,讨论了它在 C++ 中的实现,并提供了分步解决方案。通过利用 C++ 编程技术并利用函数交换字符和旋转字符串,我们成功解决了该问题并获得了所需的输出。通过本教程,读者可以有效地解决类似的问题或挑战。祝您学习愉快。编码愉快!


相关文章