小美定义一个 01串的权值为每次操作选择位取反, 使得相邻字符都不相等的最小操作次数。 例1 例如,“10001”的权值是1,因为只需要修改一次对第三个字 例2 符取反即可。 现在小美拿到了
思路:
1. 遍历给定的01串,对于每个字符,将其作为子串的起始字符。
2. 从起始字符开始,向后遍历,计算每个子串的权值。
3. 对于每个子串,判断相邻字符是否相等,如果相等,则需要进行一次操作,将其中一个字符取反。
4. 统计每个子串的权值,并累加得到所有非空子串的权值之和。
算法实现(使用Golang):
```go
package main
import "fmt"
func main() {
var s string
fmt.Scan(&s)
sum := 0
for i := 0; i < len(s); i++ {
count := 0
for j := i+1; j < len(s); j++ {
if s[j] == s[j-1] {
count++
}
sum += count
}
}
fmt.Println(sum)
}
```
以上是一个简单的算法实现,时间复杂度为O(n^2),其中n为给定01串的长度。
1. 遍历给定的01串,对于每个字符,将其作为子串的起始字符。
2. 从起始字符开始,向后遍历,计算每个子串的权值。
3. 对于每个子串,判断相邻字符是否相等,如果相等,则需要进行一次操作,将其中一个字符取反。
4. 统计每个子串的权值,并累加得到所有非空子串的权值之和。
算法实现(使用Golang):
```go
package main
import "fmt"
func main() {
var s string
fmt.Scan(&s)
sum := 0
for i := 0; i < len(s); i++ {
count := 0
for j := i+1; j < len(s); j++ {
if s[j] == s[j-1] {
count++
}
sum += count
}
}
fmt.Println(sum)
}
```
以上是一个简单的算法实现,时间复杂度为O(n^2),其中n为给定01串的长度。