题目
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2 输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6 输出: "umghlrlose"
解题
此题的方法和leetcode-189:旋转数组可以说是一模一样的,我们先是转换列表,然后再进行操作
方法一:pop和append
python写法
对列表直接进行pop和append时间复杂度会很高,所以使用了deque(双向队列),时间复杂度低
class Solution: def reverseLeftWords(self, s: str, n: int) -> str: t = collections.deque(s) for _ in range(n): c = t.popleft() t.append(c) return "".join(t)
方法二:切片
python写法
class Solution: def reverseLeftWords(self, s: str, n: int) -> str: return s[n:]+s[0:n]
c++写法
class Solution { public: string reverseLeftWords(string s, int n) { int l=s.size(); return s.substr(n,l-n+1)+s.substr(0,n); } };
不过面试可能会不让你使用切片
方法三:三次反转
python写法
class Solution: def reverseLeftWords(self, s: str, n: int) -> str: def swap(l,r): while l<r: t[l],t[r]=t[r],t[l] l+=1 r-=1 t = list(s) swap(0,n-1) swap(n,len(s)-1) swap(0,len(s)-1) return "".join(t)
c++写法
class Solution { public: string reverseLeftWords(string s, int n) { reverse(s.begin(),s.begin()+n); reverse(s.begin()+n,s.end()); reverse(s.begin(),s.end()); return s; } };
java写法
class Solution { void reverse(char[] str,int l,int r){ for(int i=l,j=r;i<j;i++,j--){ char tmp=str[i]; str[i]=str[j]; str[j]=tmp; } } public String reverseLeftWords(String s, int n) { int len=s.length(); char[] str=s.toCharArray(); reverse(str,0,n-1); reverse(str,n,len-1); reverse(str,0,len-1); return String.valueOf(str); } }
方法四:rotate方法
python写法
rotate中参数为正的代表向右旋转,负的代表向左旋转
class Solution: def reverseLeftWords(self, s: str, n: int) -> str: t = collections.deque(s) t.rotate(-n) return "".join(t)
c++写法
c++中的rotate是默认向左旋转的
class Solution { public: string reverseLeftWords(string s, int n) { rotate(s.begin(),s.begin()+n,s.end()); return s; } };
如果想要右旋转,可以向左旋转s.size()-n
方法五:拼接
字符串的拼接与旋转有一个挺好的办法 就是将字符串倍增成为两个同样的字符串拼接的长字符串
然后想旋转均可
c++写法
class Solution { public: string reverseLeftWords(string s, int n) { int len = s.size(); s += s; return s.substr(n,len); } };
再精简点
class Solution { public: string reverseLeftWords(string s, int n) { s += s; return s.substr(n,s.size()/2); } };
java写法
class Solution { public String reverseLeftWords(String s, int n) { int l=s.length(); return s.substring(n,l)+s.substring(0,n); } }