在字符串中查找是否有重复字符

    技术2022-06-25  44

        字符串类型的题目是面试笔试最青睐的类型。。。之一。最近陆陆续续重新开始看些基础的东西,真是“三天不练手生”,很多东西都忘得差不多了。。。记录在这里偶尔回顾的时候还能翻来看看。贴上来的程序经过测试的,但也可能有隐藏的bug。

     

    [方法一]

        这是最节省内存的方法,但是效率一般般。复杂度为O(n2)。

        思路是,从字符串的第一个字符开始,看后面有没有和它相同字符。

    bool RepeatChar_2(char* str) { if (*str == 0) return false; for (char *p = str; *p != 0; p++) { for (char *q = p + 1; *q != 0; q++) { if (*p == *q) { return true; } } } return false; }

     

    [方法二]

        此类题目追求的所谓最优解是复杂度越低越好,这个方法效率很高,O(N),空间换时间,需要辅助空间。思路是,开辟一个具有256个元素的整型数组,为什么是256个元素呢,因为ASCII字符一共256个(从0开始,前128个为常用的字符,如运算符、字母、数字等键盘上可以显示的,后128个为特殊字符,是键盘上找不到的字符)。这个数组的index就是字符的ASCII码,值就是该元素出现的次数。

    bool RepeatChar_1(char* str) { if (*str == 0) return false; int num[256] = {0}; char *p = str; while(*p !=0) { if (num[*p] >=1) { return true; } num[*p]++; p++; } return false; }

     

    只要这个次数大于1,就说明重复了。看到一个对while循环的不同实现,大同小异,没我这个直观,但是觉得更有趣。

    bool RepeatChar_3(char* str) { if (*str == 0) return false; int num[256] = {0}; char *p = str; while (*p != 0 && num[*p] == 0) { num[*p++] = 1; } return *p == 0 ? false : true; }

     

     


    最新回复(0)