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

题目来源

题目描述

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
在这里插入图片描述

解答

位运算

由于题目提示可以不用额外的数据结构解题,那么我们应该抛弃直观上的用set解题的方法。双重循环的暴力求解由于O(n^2)的时间复杂度,也不应该考虑。

位运算方法的思路本质上,跟使用一个bool数组来记录astr的每一位是否已经出现过的思路是一样的。

基于bool数组的方法:

由于题目没有明确说明,根据示例我判断字符串中出现的字符应该在[‘a’,‘z’]之间,实践证明确实如此。基于这个前提,使用bool数组的做法是定义一个长度为26的初始值全为0 bool数组,逐个字符遍历astr,如果bool数组中对应的下标(‘a’->0, …, ‘z’->25)的值为1则重复出现,返回false,否则设置对应下标值为1。

基于位运算的方法

我们可以使用一个int类型的变量来代替长度为26的bool数组。

class Solution {
public:
    bool isUnique(string astr) {
        if(astr.size() > 26){
            return false;
        }
        
        int check = 0;
        for(char &ch : astr){
            if(check & (1 << (ch - 'a'))){
                return false;
            }
            check |= (1 <<(ch - 'a'));
        }
        return true;
    }
};

在这里插入图片描述

解答

当最后一次索引的位置不是现在的位置就可以判断重复

        public static boolean isUnique(String astr) {
            for (int i = 0; i < astr.length(); i++){
                char c = astr.charAt(i);
                if (i != astr.lastIndexOf(c)){
                    return false;
                }
            }

            return true;
        }

在这里插入图片描述

解答

创建一个长度为255的数组,对应所有的字符的ASCII码,并遍历字符串的每一个字符,把相应的计数次数+1。

        public static boolean isUnique(String astr) {
            int [] arr = new int[256];
            char [] crr = astr.toCharArray();
            for (char c: crr){
                if ( arr[(int)c] == 1){
                    return false;
                }
                arr[(int)c] ++;
            }
            return true;
        }

在这里插入图片描述

        public static boolean isUnique(String astr) {
            int [] arr = new int[256];
            for (int i = 0; i < astr.length(); i++){
                int a = astr.charAt(i) - 'A';
                if (arr[a] == 1){
                    return false;
                }

                arr[a] = 1;
            }
            return true;
        }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值