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

177 阅读3分钟

问题描述:

请实现⼀个算法,确定⼀个字符串的所有字符【是否全都不同】。这⾥我们要求【不允许使⽤额外的存储结构】。给定⼀个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。