我try 了下面的Golang代码,以判断第一个字符串是否可以由第二个字符串组成.这段代码有什么可以改进的地方吗?

package main
import (
    "fmt"
    "strings"
)

func main() {

    words := []string{"hello", "ellhoo"}

    result := "NO"

    s := words[0]
    for i := 0; i < len(words[0]); i++ {
        if strings.Contains(words[1], string(s[i])) == false {
            result = "NO"
            break
        } else {
            result = "YES"
            words[1] = strings.Replace(words[1],string(s[i]),"",1)
        }
    }
    fmt.Println(result)

}

推荐答案

在 map 的源字符串中记录每个符文的计数.对于目标字符串中的每个符文,如果贴图中的计数为零,则失败.递减计数.

代码如下:

// canmake reports whether t can constructed from the runes in s.
func canmake(t, s string) bool {
    m := map[rune]int{}
    for _, r := range s {
        m[r]++
    }
    for _, r := range t {
        if m[r] == 0 {
            return false
        }
        m[r]--
    }
    return true
}

下面是一个示例,说明如何使用它:

func main() {
    fmt.Println(canmake("hello", "ellhoo"))
    fmt.Println(canmake("hello", "elhoo")) // insufficent number of l
    fmt.Println(canmake("hello", "elloo")) // mising h
}

Go相关问答推荐

Golang regexpp:获取带有右括号的单词

Makefile:现有文件上没有这样的文件或目录,不加载环境变量

如何存储来自异步Goroutine的返回值列表?

转到http服务器头内容-类型设置为多部分/表单-数据,但在客户端获取内容-类型:文本/纯文本

如何模拟go的Elastic search SDK?

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

切片的下限和上限

如何在golang中使用viper获取对象的配置数组?

该文件位于模块.内,该模块不包含在您的工作区中

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

在golang二进制中嵌入SvelteKit

如何将已知类型转换为指向switch 中类型参数的指针?

如何将验证器标记添加到嵌套字段

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

Exchange Web 服务 - 使用 soap xml 请求查找所有未读邮件

将值发送到 Channel 并在就绪时读取输出

使用 package`regexp` 查找 Golang 中的所有 mactch 子字符串,但得到意外结果

如何使用 math/big 对 bigInt 进行取模?

GRPC 反向代理混淆 GRPC 和 GRPC-Web

泛型:对具有返回自身的函数的类型的约束