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;
}

CareerCup之1.1字符串中字符判重

时间: 2024-08-27 03:52:20

CareerCup之1.1字符串中字符判重的相关文章

技巧之C#统计字符串中字符出现的次数(转)

方法1.自定义类 class CharNum { private char c; private int num; public char C { get { return c; } } public int Num { get { return num; } set { num = value; } } public CharNum(char ch) { this.c = ch; this.num = 1; } } static void Main(string[] args) { /* */

字符串中字符的个数和字符序列

题目 输出上次字符串中字符的个数和字符 最终的序列如下: 1, 11, 21, 1211, 111221, ... n=1时,输出字符串"1" n=2时,输出上次字符串中字符的个数和字符,因为上次字符串有1个1,所以输出11 n=3时,由于上次字符是11,有2个1,所以输出21 n=4时,由于上次字符串是21,有1个2和1个1,所以输出1211 依次类推,写个countAndSay(n)函数返回字符串. 参考代码 class Solution { public: string getN

java统计字符串中字符及子字符串个数

import java.util.Scanner;public class Counter { static Scanner scanner = new Scanner(System.in); public static void count(String s) { int low, upper, num, others; low = upper = num = others = 0; for (int i = 0; i < s.length(); i++) { if (Character.is

打印给定字符串中字符的所有排列

题目: 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 解决: 简单起见,字符串中没有相同的字符. 其实这是个递归的过程:对于字符串str,先分别逮住其中的每一个,如s,把它从str中踢开,成了 s + tr(下一次踢开t变为 t + sr),然后对于剩下来的,再从剩下的再次分别踢开一个加到左边的后面(假想被踢开的都在左边,剩下的都在右边哈),一直如此,直至右边都踢光了.算法如下

C#判断字符串是否存在字母及字符串中字符的替换实例

本文实例讲述了C#判断字符串是否存在字母及字符串中字符的替换的方法.分享给大家供大家参考.具体实现方法如下: 首先要添加对命名空间"using System.Text.RegularExpressions;"的引用 下面以一个字符串为例: 代码如下: string ss = "aaZ31 dd2f3"; string sss = ss.Replace(" ", "");//将字符串ss中的空格去掉 string sss2 =

java怎么实现统计一个字符串中字符出现的次数

问题:假设字符串仅仅保护a-z 的字母,java怎么实现统计一个字符串中字符出现的次数?而且,如果压缩后的字符数不小于原始字符数,则返回. 处理逻辑:首先拆分字符串,以拆分出的字符为key,以字符出现次数为value,存入Map中. 源码如下: 1 import java.util.HashMap; 2 import java.util.Iterator; 3 import java.util.Map; 4 5 public class TestCompress { 6 7 public sta

js:重复输出字符串中字符

复习了 重复输出一个字符串后, 重复输出一个字符串是 比如给定 str:abc  num:3 要求输出 abcabcabc 文章链接:https://www.cnblogs.com/mobu/p/9899062.html 之后,我研究起了 重复输出字符串中字符 比如给定 str:abc  num:3 要求输出 aaabbbccc 除了对字符串迭代的方法,剩下的方法相当于把字符串分成数组,然后再用上一个方法输出 /******************************************

使用Dictionary键值对判断字符串中字符出现次数

介绍Dictionary 使用前需引入命名空间 using System.Collections.Generic Dictionary里面每一个元素都是一个键值对(由两个元素组成:键和值) 键必须是唯一的,而值不需要唯一 键和值都可以是任何类型(比如:string,int,自定义类型等) 通过一个键读取一个值的时间接近0(1) 键值对之间的偏序可以不定义 使用Dictionary 使用dictionary判断字符串中字符出现次数 var dic = new Dictionary<char, in

高速比較两个字符串中字符全然同样(兄弟字符串比較)

刚才上网,看到这个问题在好多论坛上得到非常大的讨论.于是尝试练习了一下. [问题描写叙述] 对于两个字符串,判定包括的字符是否全然同样.比方:"sabac"和 "basca"算是包括的字符全然同样,而且同样字符的数量也一样要同样,但它们顺序能够不一样. [问题分析] 1.先推断两个字符串的长度是否同样 2. 推断同样长度的字符串中的字符和同样字符的数量是否同样. 3. 推断字符时,先把字符串分割成字符串数组,然后对字符数据排序,接着把两个字符串相应的字符进行比对.