Skip to content

2.判断字符串中字符是否全都不同 #108

@MagicalBridge

Description

@MagicalBridge

问题描述:

请实现⼀个算法,确定⼀个字符串的所有字符【是否全都不同】。这⾥我们要求【不允许使⽤额外的存储结构】。给定⼀个string,请返回⼀个bool值, true代表所有字符全都不同,false代表存在相同的字符。

保证字符串中的字符为【ASCII字符】。字符串的⻓度⼩于等于【3000】。

解题思路:

这⾥有⼏个重点,第⼀个是 ASCII字符 , ASCII字符⼀共有256个,其中128个是常⽤字符,可以在键盘上输⼊。128之后的是键盘上⽆法找到的。

然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使⽤额外的储存结构,且字符串⼩于等于3000。如果允许其他额外储存结构,这个题⽬很好做。如果不允许的话,可以使⽤golang内置的⽅式实现。

源码参考:

通过 strings.Count 函数判断:

package main

import (
	"fmt"
	"strings"
)

func isUniqueString(s string) bool {
	// 先判断长度,如果大于3000,直接返回false
	if strings.Count(s, "") > 3000 {
		return false
	}
	// 判断字符是否在ASCII范围内
	for _, v := range s {
		// 如果不在,直接返回false
		if v > 127 {
			return false
		}
		// 如果在,判断是否重复
		if strings.Count(s, string(v)) > 1 {
			return false
		}
	}
	return true
}

func main() {
	//	调用 isUniqueString 函数
	fmt.Println(isUniqueString("abc"))
	fmt.Println(isUniqueString("abca"))
	fmt.Println(isUniqueString("abcdefghijklmnopqrstuvwxyz"))
	fmt.Println(isUniqueString("abcdefghijklmnopqrstuvwxyza"))
}

通过 strings.Index 和 strings.LastIndex 函数判断:

func isUniqueString2(s string) bool {
	// 先判断长度,如果大于3000,直接返回false
	if strings.Count(s, "") > 3000 {
		return false
	}

	for k, v := range s {
		// 如果不在,直接返回false
		if v > 127 {
			return false
		}
		// 如果在,判断是否重复
		if strings.Index(s, string(v)) != k {
			return false
		}
	}
	return true
}

一些值得讨论的细节:

strings.Count 使用:

在Go语言中,strings.Count(s, "") 函数用于计算字符串 s 中字符的个数。这里的两个参数分别是:

  • s:要计算字符个数的字符串。
  • "":一个空字符串,表示要计算的是 s 中所有字符的个数,包括空格和其他不可见字符。

这个函数的工作原理是,它会遍历字符串 s,并统计遇到的字符个数。由于空字符串 "" 可以匹配字符串中的任何位置,所以 strings.Count(s, "") 实际上是在计算字符串 s 的长度。

例如,如果你有一个字符串 s 为 "hello world",那么 strings.Count(s, "") 的结果将是 11,因为这个字符串中总共有 11 个字符,包括空格。

strings.Index 使用:

strings.Index 是 Go 语言标准库中 strings 包的一个函数,用于在一个字符串中查找另一个字符串第一次出现的位置。如果找到了,则返回该位置的索引;如果没有找到,则返回 -1。

函数签名如下:

func Index(s, substr string) int

参数说明:

  • s:要搜索的字符串。
  • substr:要查找的子字符串。

返回值:

  • 如果找到了子字符串,则返回子字符串在字符串中第一次出现的索引。
  • 如果没有找到子字符串,则返回 -1

例如:

s := "hello world"
index := strings.Index(s, "world")
fmt.Println(index) // 输出: 6

在这个例子中,strings.Index(s, "world") 在字符串 "hello world" 中查找 "world" 第一次出现的位置,并返回其索引 6。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions