判断字符串所有字符是否全部相同的几种方法

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

示例 1:

输入: s = “leetcode”
输出: false
示例 2:

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

这个题目最容易想到的就是先排序,再利用一次循环判断前后元素是否相等就能实现。时间复杂度最少是o(nlogn);
还可以用set去重或者unordered_map的键值对来实现线性复杂度。不过需要额外的空间;一个小点,键值对的值如果是int,初始化默认为0,不用赋值了;
最不容易想到的就是位运算了,设置一个int 0为标准元素。每次让一个字符和a的差值和0按位或,这时一个位如果是1就是这个字母存在,再进行一个按位与操作,如果出现两次,按位与的结果肯定是1,就可以返回false了。

class Solution {
public:
    bool isUnique(string astr) {
        // int n=astr.length();
        // if(n==0)
        //     return true;
        // unordered_set<char> tmp;
        // for(int i=0;i<n;i++)
        // {
        //     tmp.emplace(astr[i]);
        // } 
        // int m=tmp.size();
        // if(m==n)
        //     return true;
        // else
        //     return false;

    
    //
        // unordered_map<char,int> hash;//value默认为0
        // int n=astr.length();
        // int flag=1;
        // if(n==0)
        //     return true;
        // for(int i=0;i<n;i++)
        // {
        //     hash[astr[i]]+=1;
        // }
        // for(auto iter=hash.begin();iter!=hash.end();iter++)
        // {
        //     if(iter->second>1)
        //     {
        //         flag=0;
        //         break;
        //     }
        // }
        // if(flag==1)
        //     return true;
        // else
        //     return false;
        ///
        int cnn=0;
        int n=astr.size();
        if(n==0)
            return true;
        for(int i=0;i<n;i++)
        {
            if(cnn&(1<<(astr[i]-'a')))
                return false;
            cnn=cnn|(1<<(astr[i]-'a'));
        }
        return true;
    }
};

但是要注意,int只有32位,所以只能判断32种字符,这题测试用例都是小写字母,所以可以通过,如果存在其他特殊字符就不一定了,至少要128位的才可以,所以巧妙的方法不是任何情况都适用的。

猜你喜欢

转载自blog.csdn.net/weixin_53344209/article/details/126473230#comments_27407726