给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。
暴力遍历时间复杂度是O(m*n),可以用三步反转法达到O(n),先分开反转,再整体反转。
Golang代码段:
package main
import "fmt"
func reverseList(s *string, m int, n int) string{
sByte := []byte(*s)
for {
if (m > n) {
break
}
t := sByte[m]
sByte[m] = sByte[n]
sByte[n] = t
m += 1
n -= 1
}
return string(sByte)
}
func main() {
ss := "hello"
m := 2
n := 5
ss = reverseList(&ss, 0, m-1)
ss = reverseList(&ss, m, n-1)
ss = reverseList(&ss, 0, n-1)
fmt.Println(ss)
}
Python代码段:
#!/usr/bin/python
def reverseList(s:str, m:int, n:int):
while m < n:
temp = s[n]
tailer = s[n+1:] if n + 1 < len(s) else ''
s = s[:n] + s[m] + tailer
s = s[:m] + temp + s[m+1:]
m += 1
n -= 1
return s
s = "hello"
m = 1
n = 5
s = reverseList(s, 0, m-1)
s = reverseList(s, m, n-1)
s = reverseList(s, 0, n-1)
print(s)