面试金典题1

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode"
输出: false 

示例 2:

输入: s = "abc"
输出: true

限制:

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

这道题我第一时间想到的就是用一个数组存个数,一个数组存26个字符,但是那样操作时间复杂度应该会很高,因此可以用哈希表,key-value的形式来存储,key存字符,value存个数

class Solution {
public:
    bool isUnique(string astr) {
        //定义一个vector容器,用来存储数组的字符个数,256覆盖了所有可能的字符
        //实际上123就可以,因为小写字母对应最大的为122
        vector<int> hash(256);
        //循环遍历将每个字符存入哈希表,并进行计数+1
        for(auto x:astr){
            ++hash[x];
            //若计数超过1,即存在两个相同的字符,则返回false
            if(hash[x]>1){
                return false;
            }
        }
        return true;
    }
};

因为题目说最好不要用数据结构,所以换一种简单的思路,就是将字符串进行排序,然后只要比较相邻字符是否相同就好了

class Solution {
public:
    bool isUnique(string astr) {
        //定义数组的字符长度为l
        int len=astr.size();
        //若数字长度超过26,则必定有重复字符
        if(len>26){
            return false;
        }
        //对字符串进行排序
        sort(astr.begin(),astr.end());
        //遍历字符串,比较相邻字符是否相同
        for(int i=0;i<len;i++){
            if(astr[i]==astr[i+1]){
                return false;
            }
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值