CareerCup之1.1字符串中字符判重

简介:

【题目】

Chapter 1 | Arrays and Strings

原文:

1.1 Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?

译文:

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

【分析】

【思路一】首先,我们要搞清楚构成字符串的字符个数到底有多大?是ASCII字符,还是只是26个字母? 还是有更大的字符个数,对于不同的情况,我们可能会有不同的解决方案。如果我们假设字符集是ASCII字符,那么我们可以开一个大小为256的bool数组来表征每个字 符的出现。数组初始化为false,遍历一遍字符串中的字符,当bool数组对应位置的值为真, 表明该字符在之前已经出现过,即可得出该字符串中有重复字符。否则将该位置的bool数组 值置为true。

该算法的时间复杂度为O(n)。

【思路二】

我们还可以通过位运算来减少空间的使用量。其实就是用所谓的Bit-map的原理来存储。就是用一个bit位来标记某个元素对应的Value,在这就是该元素是否出现的bool值,而Key即是该元素。用每一位表征相应位置字符是否出现。对于ASCII字符,我们需要256位,即一个长度为8的int数组map即可(8*4*8)。
这里的关键是要把字符对应的ASCII,映射到正确的位上去。
举个例子:
字符'a'对应的ASCII是97,那么我们应该将数组中的哪一位置为1呢?
用97除以32,得到对应数组map的下标:3。97对32取模得到相应的位:1。

【代码】

/*********************************
*   日期:2014-05-04
*   作者:SJF0115
*   题目: 字符串中字符判重
*   来源:CareerCup
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

bool IsUnique(string str){
    bool visited[256];
    //初始化
    memset(visited,false,sizeof(visited));
    int len = str.length();
    for(int i = 0;i < len;i++){
        int index = (int)str[i];
        //判断是否有重复
        if(!visited[index]){
            visited[index] = true;
        }
        else{
            //有重复直接返回
            return true;
        }
    }
    return false;
}

int main(){
    string str = "i am xiaosi";
    bool result = IsUnique(str);
    cout<<result<<endl;
    return 0;
}

【代码2】

/*********************************
*   日期:2014-05-04
*   作者:SJF0115
*   题目: 字符串中字符判重
*   来源:CareerCup
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

//判断字符串中字符是否重复
bool IsUnique(string str){
    //8*4*8 共256位可以表示256个元素
    int map[8];
    //初始化
    memset(map,0,sizeof(map));
    int len = str.length();
    for(int i = 0;i < len;i++){
        int value = (int)str[i];
        int index = value / 32, offset = value % 32;
        //判断是否已经存储过
        if(map[index] & (1 << offset)) {
            //重复
            return false;
        }
        map[index] |= (1 << offset);
    }
    return true;
}

int main(){
    string str = "i amxos ";
    bool result = IsUnique(str);
    cout<<result<<endl;
    return 0;
}




目录
相关文章
|
10月前
|
人工智能 算法 数据挖掘
StoryTeller:字节、上海交大、北大共同推出的全自动长视频描述生成一致系统
StoryTeller是由字节跳动、上海交通大学和北京大学共同推出的全自动长视频描述生成系统。该系统通过音频视觉角色识别技术,结合低级视觉概念和高级剧情信息,生成详细且连贯的视频描述。StoryTeller在MovieQA任务中展现出比现有模型更高的准确率,适用于电影制作、视频内容分析、辅助视障人士等多个应用场景。
454 0
StoryTeller:字节、上海交大、北大共同推出的全自动长视频描述生成一致系统
|
10月前
|
小程序 前端开发 算法
|
XML 传感器 移动开发
实现一个360全景的N种方案
手把手教你实现360全景浏览效果。
实现一个360全景的N种方案
|
Web App开发 测试技术
Jmeter压测——BlazeMeter录制脚本+Jmeter进行测试
Jmeter压测——BlazeMeter录制脚本+Jmeter进行测试
1021 0
|
机器学习/深度学习 人工智能 边缘计算
|
Dubbo Cloud Native Java
数据变更白屏化利器-推送轨迹上线
微服务引擎MSE面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持Nacos/ZooKeeper/Eureka)、云原生网关(原生支持Ingress/Envoy)、微服务治理(原生支持Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。
数据变更白屏化利器-推送轨迹上线
|
安全 Ubuntu 测试技术
kali介绍
本篇主要介绍Kali系统和用于渗透测试的靶机系统,内容包括kali的发展过程、kali的功能、kali系统的安装和基本设置,以及目前流行的几种靶机系统介绍
kali介绍
|
存储 Android开发 iOS开发
三分钟了解Studio One6最新版二十项功能介绍及下载
Studio One是一款音乐编曲软件,是音乐工作者必不可少的创作工具,用于创建、录制、混合和掌握音乐和其他音频。无论你是第一次接触数字音乐工作站(DAW),还是第一次尝试制作属于自己的音乐,Studio One 6都能给你非凡的体验!Studio One 6新功能包括智能模板、乐谱支持歌词,全局视频轨,还有全新的声码器插件。万众期待的2022新版 Studio One 终于来了!在广受好评的5系列基础上,Studio One 6 又将给喜欢创作音乐的爱好者,带来哪些惊喜功能呢?请跟随 Studio One 中文来一探究竟!抢先体验20项全新功能吧!
2249 0
|
移动开发 数据可视化 搜索推荐
MindManager2023软件功能特色介绍
MindManager思维导图软件是一款创造、管理和交流思想的思维导图软件,界面友好功能强大,头脑风暴、会议管理及项目管理工具帮您轻松创建思维导图,有序组织思维、资源和项目进程。
994 0
|
安全
在阿里云后置台充值后如何提现—详细教程
您可前往新用户中心,在新用户中心页面,可以看到您的余额和提现入口,点击提现按钮,进入到提现页面进行提现操作。阿里云余额提现,提现到哪里?操作流程
2257 2