字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

  • 直接用一个数组,计数
1
2
3
4
5
6
7
8
9
10
11
12
13
func firstUniqChar(s string) int {
nums := [26]int{}
for _, a := range s {
nums[a - 'a']++
}

for i, a := range s {
if nums[a - 'a'] == 1 {
return i
}
}
return -1
}

赎金信

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。

(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

  • 这题和上一题差不多
1
2
3
4
5
6
7
8
9
10
11
12
13
func canConstruct(ransomNote string, magazine string) bool {
ransomNums := make([]int, 26)
for _, a := range magazine {
ransomNums[a - 'a']++
}
for _, a := range ransomNote {
ransomNums[a - 'a']--
if ransomNums[a-'a'] < 0 {
return false
}
}
return true
}

有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

  • 简单用一个数组去记录,加减法,最后不为0则false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func isAnagram(s string, t string) bool {
Nums := make([]int, 26)
for _, a := range s {
Nums[a - 'a']++
}

for _, a := range t {
Nums[a - 'a']--
}

for _, n := range Nums {
if n != 0 {
return false
}
}
return true
}
  • 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//进阶。对于进阶问题,\text{Unicode}Unicode 是为了解决传统字符编码的局限性而产生的方案,它为每个语言中的字符规定了一个唯一的二进制编码。而 \text{Unicode}Unicode 中可能存在一个字符对应多个字节的问题
func isAnagram1(s, t string) bool {
if len(s) != len(t) {
return false
}
cnt := map[rune]int{}
for _, ch := range s {
cnt[ch]++
}
for _, ch := range t {
cnt[ch]--
if cnt[ch] < 0 {
return false
}
}
return true
}