LeetCode 面试题 01.01. 判定字符是否唯一

一、题目

  实现一个算法,确定一个字符串 s 的所有字符是否全都不同,点击此处跳转

示例 1:

输入: s = “leetcode”
输出: false

示例 2:

输入: s = “abc”
输出: true

限制:

  • 0 <= len(s) <= 100
  • s[i] 仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。

二、C# 题解

  使用数组记录出现次数,时间、空间复杂度均为 O ( n ) O(n) O(n)

public class Solution {
    public bool IsUnique(string astr) {
        int[] record = new int[26];              // 记录数组
        for (int i = 0; i < astr.Length; i++) {  // 遍历字符串
            int index = (int) (astr[i] - 'a');   // 得到每个字符在数组中对应的下标
            if (record[index] > 0) return false; // 出现,则返回 false
            else record[index]++;                // 未出现,则记录 + 1
        }
        return true;                             // 到此步,则返回 true
    }
}

  数组记录有些浪费内存空间了,因此使用位运算记录也可。因为题目要求是字符串内仅包含小写字母,因此只会出现26种不同的字符,使用 int 变量有 32 位长度,足以覆盖范围。

0000 0000 0000 0000 0000 0000 0000 0000 ↓ ′ c ′ 0000 0000 0000 0000 0000 0000 0000 0100 ↓ ′ g ′ 0000 0000 0000 0000 0000 0000 0100 0100 ↓ ′ a ′ 0000 0000 0000 0000 0000 0000 0100 0101 ↓ ′ c ′ 重复,返回 f a l s e 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000\\ ↓ 'c'\\ 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0100\\ ↓ 'g'\\ 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0100 \quad 0100\\ ↓ 'a'\\ 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0000 \quad 0100 \quad 0101\\ ↓ 'c'\\ 重复,返回 false 00000000000000000000000000000000c00000000000000000000000000000100g00000000000000000000000001000100a00000000000000000000000001000101c重复,返回false

  位运算记录的本质与上述数组记录类似,差别仅是内存使用。数组使用一个 int(32 位 bit)记录,而位运算使用 1 个 bit 记录,本质无区别。当然,运行速度会快些。

public class Solution {
    public bool IsUnique(string astr) {
        int record = 0;                              // 记录 int
        for (int i = 0; i < astr.Length; i++) {      // 遍历字符串
            int index = 1 << (int) (astr[i] - 'a');  // 得到每个字符在 int 中对应的 bit 位数
            if ((record & index) != 0) return false; // 与运算结果不为 0,则表示出现过
            else record |= index;                    // 未出现,则或运算记录下该字符
        }
        return true;                                 // 到此步,则返回 true
    }
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度:取决于出现字符的种类数目,此题为 O ( 1 ) O(1) O(1)

使用位运算的好处:

  • 满足题目要求;
  • 运行效率快些;
  • 锻炼编程能力。

坏处:

  • 处理字符种类有限:int 只能处理 32 种,long 只能处理 64 种;
  • 不易于读写与修改。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值