题解 | #左旋转字符串#
左旋转字符串
http://www.nowcoder.com/practice/12d959b108cb42b1ab72cef4d36af5ec
算法思想一:遍历
解题思路:
将字符串 s 分为两个部分,分别对两部分循环遍历,形成左旋转字符串
1、判断特殊情况:字符串 s 为空字符,n > len(s),直接返回空字符
2、创建返回字符 res,循环遍历字符串 s 的【n,len(s)-1】,依次添加到res中
3、第二次循环遍历字符串 s 的【0,n-1】,依次添加到 res 中
4、返回res
代码展示:
Python版本
class Solution: def LeftRotateString(self, s, n): # write code here res = '' if not s&nbs***bsp;n > len(s): return res for i in range(n, len(s)): res += s[i] for j in range(n): res += s[j] return res
复杂度分析:
时间复杂度O(N):两次循环遍历整个字符串,N表示字符串的长度
空间复杂度O(N):返回数组占用空间,整个字符串长度
算法思想二:substring
解题思路:
主要理由字符串的 substring 函数,根据题意使用 substring 获取指定区间的字符串,最后拼接返回 1、判断特殊情况:字符串 s 为空字符,n > len(s),直接返回空字符
2、str.substring(n) + str.substring(0, n) 拼接返回
字符串 str = 'abcXYZdef' n=3
步骤 | str.substring(n) | str.substring(0, n) |
1 | ‘XYZdef’ | 'abc' |
2 | 合并:'XYZdefabc' |
代码展示:
JAVA版本
public class Solution { public String LeftRotateString(String str,int n) { if (str == null || n > str.length()) { return str; } return str.substring(n) + str.substring(0, n); } }
复杂度分析:
时间复杂度O(1):使用函数直接获取区间
空间复杂度O(1):没有使用额外空间
算法思想三:字符串字串
解题思路:
由于 s + s 包含了所有可以通过旋转操作从 s 得到的字符串 1、使用额外字符串 tmp = s + s
2、直接获取 tmp字符串的 【n:n+len(s)】
字符串 str = 'abcXYZdef' n=3
tmp = s + s : 'abcXYZdefabcXYZdef'
tmp[n:n+len(s)] = 'XYZdefabc'
代码展示:
Python版本
class Solution: def LeftRotateString(self, s, n): # write code here tmp = s + s return tmp[n:n+len(s)]
复杂度分析:
时间复杂度O(1):使用函数直接获取区间
空间复杂度O(N):使用额外空间tmp,占用 2N 空间