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

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

方法1:排序

思路

  1. 首先利用STL中的sort函数对字符串s进行排序,字符串的字符按照字符的ASCII码大小升序排列,相同字符紧挨在一起。
  2. 判断相邻字母astr[i-1]和astr[i]是否相等,其中i>=0。如果astr[i-1]=astr[i],说明字符串s中存在相同字符,返回false。
  3. 如果遍历完整个字符串s都没有发现相同字符,返回true。

代码

/**
1.时间复杂度:O(nlogn)
2.空间复杂度:O(1)
**/
class Solution {
public:
    bool isUnique(string astr) {
        // 对字符串进行升序排列
        sort(astr.begin(), astr.end());
        // 遍历字符串s中的每个字符
        for(int i = 1; i < astr.size(); i++){
            // 如果存在相等的相邻字符,返回false
            if(astr[i] == astr[i - 1]){
                return false;
            }
        }
        // 如果不存在相等的相邻字符,返回true
        return true;
    }
};

复杂度分析

  1. 时间复杂度:\(O(nlogn)\)。sort函数使用的是类似快速排序的算法,平均时间复杂度为\(O(nlogn)\)​。遍历字符串判断所需的时间复杂度为\(O(n)\)。故而算法的整体时间复杂度为\(O(nlogn)\)
  2. 空间复杂度:\(O(1)\)​。除了字符串astr之外没有开辟新的内存空间。

方法2:位运算

思路

在假设字符串只由小写字母和大写字母组成的情况下,可以使用一个long类型(长整型)数字mask来记录已经出现的字符,mask的每一位对应一个字符。如下图所示:

image.png

第1位对应A,第2位对应B,第3位对应C,第4位对应D,后面的位按照字符的ASCII码大小依次对应。

然后再遍历字符串中的字符,先判断对应的位置是否是1,如果是1,就表示已经存在了,直接返回false,如果对应的位置不是1,说明这个字符还没出现过,然后把对应的位置置为1。

代码

/**
1.时间复杂度:O(n)
2.空间复杂度:O(1)
**/
class Solution {
public:
    bool isUnique(string astr) {
        long mask = 0;
        for(char c : astr){
            int dif = c - 'A';
            if((mask & (1L << dif)) != 0){
                return false;
            }else{
                mask |= (1L << dif);
            }
        }
        return true;
    }
};

复杂度分析

  1. 时间复杂度:\(O(n)\)​。
  2. 空间复杂度:\(O(1)\)​。除了字符串astr之外没有开辟新的内存空间。
posted @ 2021-09-02 23:07  RiverCold  阅读(70)  评论(0编辑  收藏  举报