1 題目描述
字符串的左旋轉操作是把字符串前面的若干個字符轉移到字符串的尾部。請定義一個函數實現字符串左旋轉操作的功能。比如,輸入字符串"abcdefg"和數字2,該函數將返回左旋轉兩位得到的結果"cdefgab"。
示例 1:
輸入: s = “abcdefg”, k = 2
輸出: “cdefgab”
示例 2:
輸入: s = “lrloseumgh”, k = 6
輸出: “umghlrlose”
限制:
1 <= k < s.length <= 10000
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
摘自大佬的解釋,大佬用了三種解法
面試題58 - II. 左旋轉字符串(切片 / 列表 / 字符串,清晰圖解)
這裏只列舉我能想到的兩種吧
- 方法一:字符串切片
應用字符串切片函數,可方便實現左旋轉字符串。
獲取字符串 s[n:] 切片和 s[:n] 切片,使用 “+” 運算符拼接並返回即可。
- 複雜度分析:
時間複雜度 O(N) : 其中 N 爲字符串 s 的長度,字符串切片函數爲線性時間複雜度(參考資料);
空間複雜度 O(N) : 兩個字符串切片的總長度爲 N 。
- 方法二:字符串遍歷拼接
- 算法流程:
(1)新建一個 list(Python)、StringBuilder(Java) ,記爲 res ;
(2)先向 res 添加 “第 n+1 位至末位的字符” ;
(3)再向 res 添加 “首位至第 n 位的字符” ;
(4)將 res 轉化爲字符串並返回。
- 複雜度分析:
時間複雜度 O(N) : 線性遍歷 s 並添加,使用線性時間;
空間複雜度 O(N) : 新建的輔助 res 使用 O(N) 大小的額外空間。
作者:jyd
鏈接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/mian-shi-ti-58-ii-zuo-xuan-zhuan-zi-fu-chuan-qie-p/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
3 解決代碼
- 方法一:字符串切片《Java 代碼》
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n, s.length()) + s.substring(0, n);
}
}
- 方法一:字符串切片《python代碼》
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:] + s[:n]
- 方法二:字符串遍歷拼接《Java代碼》
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder res = new StringBuilder();
for(int i = n; i < s.length(); i++)
res.append(s.charAt(i));
for(int i = 0; i < n; i++)
res.append(s.charAt(i));
return res.toString();
}
}
- 方法二:字符串遍歷拼接《python代碼》
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res = []
for i in range(n, len(s)):
res.append(s[i])
for i in range(n):
res.append(s[i])
return ''.join(res)