トピック:
文字列の左回転操作は、文字列の前のいくつかの文字を文字列の末尾に転送することです。
文字列の左回転操作の機能を実現する関数を定義してください。
たとえば、文字列「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 位置を再度削除します。