//151.翻转字符串里的单词
package main
import "fmt"
func reverseWords(s string) string {
// 1.去除字符串中多余的空格
b := []byte(s) //将字符串转换为字符切片
slow, l := 0, len(b)
for fast := 0; fast < l; fast++ {
if b[fast] != ' ' { //直接让fast指针移动到第一个字母的位置
if slow != 0 { //排除字符串开头的空格
b[slow] = ' ' //保留单词间的空格
slow++
}
for fast < l && b[fast] != ' ' {
b[slow] = b[fast]
slow++
fast++
}
}
}
b = b[:slow] //取slow之前的字符串
// 2.反转整体字符串
reverse(b)
// 3.反转每个单词
last := 0 //慢指针
l = len(b)
for i := 0; i <= l; i++ { //注意这里是i<=l
if i == l || b[i] == ' ' { //当i等于字符串长度或者值为空,i==l必须写在前面因为b[l]不存在会报错
reverse(b[last:i]) //反转每个单词,左闭右开
last = i + 1
}
}
return string(b) //将字符切片转换为字符串
}
func reverse(b []byte) {
l := len(b)
low, high := 0, l-1
for low < l/2 {
b[low], b[high] = b[high], b[low]
low++
high--
}
}
func main() {
s := " the sky is blue "
res := reverseWords(s)
fmt.Printf("res: %v\n", res) //res: blue is sky the
}
//07 459. 重复的子字符串
package main
import (
"fmt"
"strings"
)
func main() {
s := "abcabc"
res := repeatedSubstringPattern(s)
fmt.Printf("%v", res)
}
func repeatedSubstringPattern(s string) bool {
if len(s) == 0 {
return false
}
ss := s + s
return strings.Contains(ss[1:len(ss)-1], s) //在Go语言中,strings.Contains是一个用来检查子字符串是否存在于另一个字符串中的函数,返回值为bool类型
}