ソード ポインター オファー 58 - II. 文字列の左回転 (3 つのメソッド)

トピック:
文字列の左回転操作は、文字列の前のいくつかの文字を文字列の末尾に転送することです。

文字列の左回転操作の機能を実現する関数を定義してください。

たとえば、文字列「abcdefg」と数値 2 を入力すると、関数は 2 ビット左回転した結果「cdefgab」を返します。

例 1:

入力: s = "abcdefg"、k = 2
出力: "cdefgab"
例 2:

入力: s = “lrloseumgh”、k = 6
出力: “umghlrlose”

制限:

1 <= k < s.length <= 10000

出典: LeetCode

1: 新しいスペースを開く

class Solution {
    
    
public:
    string reverseLeftWords(string s, int n) {
    
    
   string ans = "";
        for(int i = n; i < s.size(); i++){
    
    
            ans += s[i];
        }
        for(int i = 0; i < n; i++){
    
    
            ans += s[i];
        }
        return ans;
    }
};
ans += s[i];

C++の文字列の性質を利用する
つまり、最初に次の文字列を出力し、その後に前の文字列を出力することになります。これは
文字列を左に回転することに相当します。

class Solution {
    
    
public:
    //无论是左移还是右移都可以使用多次反转实现
    void reverseStr(string& s, int l, int r){
    
    
        while(l < r){
    
    
            char temp = s[r];
            s[r--] = s[l];
            s[l++] = temp;
        }
    }
    string reverseLeftWords(string s, int n) {
    
    
        //原地修改,空间复杂度O(1);
        reverseStr(s, 0, s.size() - 1);//先进行第一次(全体翻转)
      
        reverseStr(s, 0, s.size() - n - 1);//第二次 将第一个到倒数第n个反转
  
        reverseStr(s, s.size() - n, s.size() - 1); //第三次 将倒数第n个到最后一个反转
      
        return s;
    }
};

インプレース変更では追加のスペースを空ける必要はありません。実際、スペースを確保する時間です。

3: C++ 機能を使用してその場で変更する

class Solution {
    
    
public:
    string reverseLeftWords(string s, int n) {
    
    
        int len =s.size();

        s.resize(len+n);

        for(int i=0;i<n;i++){
    
    
            s[len++] =s[i];
        }

        s.erase(0,n);
        return s;
    }
};

C++ の文字列コンテナーのサイズ変更関数を使用してサイズを再定義し、
for ループを使用して割り当ての位置を再度開きます。
s.erase(0,n); 最初の n 位置を再度削除します。

おすすめ

転載: blog.csdn.net/2202_75623950/article/details/130654898
おすすめ