zoukankan      html  css  js  c++  java
  • 判断一个字符串中的字符是否唯一(面试题1)

    参考地址:http://www.cricode.com/254.html

    实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)

    解答

    首先,你可以问面试官,构成字符串的字符集有多大?是ASCII字符,还是只是26个字母? 还是有更大的字符集,对于不同的情况,我们可能会有不同的解决方案。

    如果我们假设字符集是ASCII字符,那么我们可以开一个大小为256的bool数组来表征每个字 符的出现。数组初始化为false,遍历一遍字符串中的字符,当bool数组对应位置的值为真, 表明该字符在之前已经出现过,即可得出该字符串中有重复字符。否则将该位置的bool数组 值置为true。

    该算法的时间复杂度为O(n)。我们还可以通过位运算来减少空间的使用量。 用每一位表征相应位置字符的出现。对于ASCII字符,我们需要256位,即一个长度为8的int 数组a即可。这里的关键是要把字符对应的数字,映射到正确的位上去。比如字符’b’对应的 代码是98,那么我们应该将数组中的哪一位置为1呢?用98除以32,得到对应数组a的下标: 3。98对32取模得到相应的位:2。

    代码截图如下:

    如果字符集只是a-z(或是A-Z),那就更好办了,用位运算只需要一个整型数即可。

    完整代码如下:

    /*===============================================
    # Author: RollerCoaster
    # Last modified:2014-09-09 12:14
    # Filename: 01判断一个字符串中的字符是否唯一.c
    # Description:这个题目的愿意为判断一个字符串中的每一个字符是否唯一。
    =================================================*/
    
    #include<iostream>
    #include<string>
    using namespace std;
    
    // 功能:判断一个字符串中的每个字符是否唯一
    // 入参:s 字符串
    // 返回:是否唯一
    bool isUnique1(string s)
    { 
        bool a[256];
        memset(a, 0, sizeof(a));
        int len = s.length();
        for(int i = 0; i < len; i++)
        {
            int v = (int)s[i];
            if (a[v])
            {
                // 该字符已经出现过,所以不唯一
                return false;
            }
            a[v] = true;
        }
    
        return true;
    }
    
    // 功能:判断一个字符串中的字符是否唯一,使用位操作节省空间
    // 输入:s 字符串
    // 返回:是否唯一
    bool isUnique2(string s)
    {
        int a[8];
        memset(a, 0, sizeof(a));
        int len = s.length();
        for(int i = 0; i < len; i++)
        {
            int v = (int)s[i];
            int index = v / 32;
            int pos = v % 32;
            if (a[index] & (1 << pos))
            {
                return false;
            }
    
            a[index] |= (1 << pos);
        }
    
        return true;
    }
    
    
    
    // 功能:判断字符串a - z 或是(A—Z)中字符是否唯一。
    // 参数:s 字符串
    // 返回:是否唯一
    bool isUnique3(string s)
    {
        int check = 0;
        int len = s.length();
        for(int i = 0; i < len; i++)
        {
            int v = s[i] - 'a';
            if (check & (1 << v))
            {
                return false;
            }
    
            check |= (1 << v);
        }
    
        return true;
    }
    
    int main()
    {
        string s1;
        while(cin>>s1)
        {
            cout << isUnique1(s1) << endl;
            cout << isUnique2(s1) << endl;
            cout << isUnique3(s1) << endl;
        }
    
        return 0;
    }
    作者:BestNow
    出处:http://www.cnblogs.com/BestNow/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Kubernetes Jenkins动态创建Slave
    运维故障汇总
    Spinnaker调用Jenkins API 返回403错误
    linux删除文件空间不释放问题解决
    华为 路由交换之DHCP
    华为 路由交换之PPPoE
    关于==和equals的探索
    springboot&mybatis 增删改查系列(二)
    springboot&mybatis 增删改查系列(一)
    nginx简单使用(windows)
  • 原文地址:https://www.cnblogs.com/tianxue/p/3961281.html
Copyright © 2011-2022 走看看