C++程序 通过执行给定的移位操作修改字符串

C++程序 通过执行给定的移位操作修改字符串

给定一个包含小写英文字母的字符串 S 和一个由形如 {direction, amount} 的对组成的矩阵 shift[][] ,其中方向可以是 0(表示左移)1(表示右移)amount 是需要将 S 字符串向前移动的索引数。任务是返回可通过执行给定操作获得的修改后的字符串。

_注意: 将第一个字符从 S 中移除并将其添加到末尾,称为左移1.类似地,将最后一个字符从 **S 中移除并插入到开头,称为右移1。

示例

输入: S = “abc”,shift[][] = {{0, 1}, {1, 2}}

输出: cab

解释:

[0,1]表示将S [0]向左移1。 因此,从“abc”修改后字符串S变成“bca”。

[1,2]表示将S [0]向右移1。 因此,从“bca”修改后字符串S变成了“cab”。

输入: S =“abcdefg”,shift[][] = {{1, 1}, {1, 1}, {0, 2}, {1, 3}}

输出: efgabcd

解释:

[1,1]表示将S [0]向右移1。 因此,从“abcdefg”修改后字符串S变成“gabcdef。”

[1,1]表示将S [0]向右移1。 因此,从“gabcdef”修改后字符串S变成“fgabcde”。

[0,2]表示将S [0]向左移2。 因此,从“fgabcde”修改后字符串S变成“abcdefg”。

[1,3]表示将S [0]向右移3。 因此,从“abcdefg”修改后字符串S变成“efgabcd。”

朴素方法: 解决此问题的最简单方法是遍历矩阵 shift[][] ,并将 S[0] 根据指定方向的索引数移动。 在完成所有移位操作后,打印得到的最终字符串。

时间复杂度: O(N2)

辅助空间: O(N)

高效方法: 为了优化上述方法,请执行以下步骤:

  • 初始化变量 val 以存储有效移位数。
  • 遍历矩阵 shift[][] ,并对每个 第i行 执行以下操作:
  • 如果 shift[i][0] = 0左移 ),则将 val 减去 - shift [i] [1]
  • 否则( 右移),将 val 增加 shift [i] [1]
  • 更新 val = val%len (以进一步优化有效位移)。
  • 初始化字符串 result = “” 以存储修改后的字符串。
  • 现在,检查 if val >0。如果结果为真,则按 val 向右旋转字符串。
  • 否则,按 |val| 向左旋转字符串。
  • 打印 result

下面是上述方法的实现:

// 上述方法的C++实现
#include
using namespace std;

// 执行给定的偏移量操作后找到得到的字符串
void stringShift(string s,
                 vector>& shift)
{
    int val = 0;

    for (int i = 0; i < shift.size(); ++i)

        // 如果shift [i] [0] = 0,那么向左移动
        // 否则,向右移动
        val += shift[i][0] == 0
                   ? -shift[i][1]
                   : shift[i][1];

    // 存储字符串的长度
    int len = s.length();

    // 有效偏移量计算
    val = val % len;

    // 存储修改后的字符串
    string result = "";

    // 右旋转
    if (val > 0)
        result = s.substr(len - val, val)
                 + s.substr(0, len - val);

    // 左旋转
    else
        result 
            = s.substr(-val, len + val)
              + s.substr(0, -val);

    cout << result;
}

// 驱动程序
int main() {
    string s = "abc";
    vector> shift = {
        { 0, 1 },
        { 1, 2 }
    };

    stringShift(s, shift);

    return 0;
}  

输出:

cab

时间复杂度: O(N)

辅助空间: O(N)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例