Leetcode - Min Stack
Leetcode - Time Based Key-Value Store

Leetcode - Perform String Shifts

violet posted @ Apr 15, 2020 01:12:05 AM in 算法 with tags Algorithm Golang array , 265 阅读

You are given a string s containing lowercase English letters, and a matrix shift, where shift[i] = [direction, amount]:

  • direction can be 0 (for left shift) or 1 (for right shift). 
  • amount is the amount by which string s is to be shifted.
  • A left shift by 1 means remove the first character of s and append it to the end.
  • Similarly, a right shift by 1 means remove the last character of s and add it to the beginning.

Return the final string after all operations.

 

Example 1:

Input: s = "abc", shift = [[0,1],[1,2]]
Output: "cab"
Explanation: 
[0,1] means shift to left by 1. "abc" -> "bca"
[1,2] means shift to right by 2. "bca" -> "cab"

 

1. Given a sum to track final shift count. When shifting left, sum - current. While shifting right, sum + current

2. If sum == 0, no need to shift. If sum > 0, shift right. If sum < 0, shift left.

3. This question is converted to rotate an array

func stringShift(s string, shift [][]int) string {
    if len(s) <= 1 {
        return s
    }
	sum := 0
	for _, i := range shift {
		if i[0] == 0 {
			sum -= i[1]
		} else {
			sum += i[1]
		}
	}
	if sum == 0 {
		return s
	}
	if sum > 0 {
		// shift right
		if sum > len(s) {
			sum = sum % len(s)
		}
		str := []byte(s)
		shiftArr(str, sum)
		return string(str)
	}

	// shift left
	if 0-sum > len(s) {
		sum = sum % len(s)
	}
	str := []byte(s)
	shiftArr(str, len(s)+sum)
	return string(str)

}

func shiftArr(s []byte, k int) {
	reverse(s)
	reverse(s[:k])
	reverse(s[k:])
}

func reverse(s []byte) {
	size := len(s)
	for i := 0; i < size/2; i++ {
		s[i], s[size-1-i] = s[size-1-i], s[i]
	}
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter