day2 —— 判断字符串中的字符是否唯一

目录

前言

问题描述

代码解释


 

前言

若是想要了解基本语法的话,请到(7条消息) C语言从练气期到渡劫期_要一杯卡布奇诺的博客-CSDN博客查看相应的语法细节

强烈安利这篇文章 —— (4条消息) 筑基五层 —— 位运算看这篇就行了_要一杯卡布奇诺的博客-CSDN博客

 

问题描述

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

题目来源:面试题 01.01. 判定字符是否唯一 - 力扣(Leetcode)

 

 

代码解释

        法一:暴力枚举比较

思路分析:直接循环遍历每个字符进行比较,找到了,返回false,没有找到,返回true

bool isUnique(char* astr) 
{
    for(int i=0; i<strlen(astr); i++)
    {
        for(int j=i+1; j<strlen(astr); j++)
        {
            //找到相同字符
            if(astr[i] == astr[j])
                return false;
        }
    }
    //没有找到相同字符
    return true;
}

        法二:哈希表

思路分析:把字符串中的值映射到哈希数组的下标中,字符串的每个字符在哈希数组着中有对应的下标,则该下标自增,如果哈希中有大于1的值,则说明字符串的字符不唯一

bool isUnique(char* astr) 
{
    char hash[128] = {0};//哈希数组
    memset(hash,0,sizeof(hash));//初始化
    
    //把字符的对应值映射到哈希数组中
    for(int i=0; i<strlen(astr); i++)
        hash[astr[i]]++;

    for(int i=0; i<128; i++)
    {
        //判断有没有下标的值超过1的
        if(hash[i] > 1)
            return false;
    }    
    return true;
}

         法三:排序

思路分析:进行排序,排序后比较相邻的值,如果有相同的值则说明字符串中的字符不唯一

bool isUnique(char* astr) 
{
    //空指针判断
    if(astr == NULL)
        return false;
    //空串判断                    
    if(strlen(astr) == 0)
        return true;
    
    //冒泡排序
    for(int i=0; i<strlen(astr)-1;i++)
    {
        int flag = 1;//假设有序
        for(int j=0; j<strlen(astr) - i - 1; j++)
        {
            if(astr[j] > astr[j+1])
            {
                flag = 0;//无序
                char tmp = astr[j];
                astr[j] = astr[j+1];
                astr[j+1] = tmp;
            }
        }
        //有序则跳出循环
        if(flag == 1)
            break;
    }
    
    for(int i=0; i<strlen(astr)-1; i++)
    {
        //判断相邻字符
        if(astr[i] == astr[i+1])
            return false;
    }
    return true;
}

        法四:双指针

思路分析:使用双指针进行对字符串遍历,思路和暴力枚举的思路一样 

bool isUnique(char* astr) 
{    
    char* cur = astr;
    assert(astr);//判断空指针
    //空串判断
    if (strlen(astr) == 0)
        return true;
        
    while (*astr != '\0')
    {
        cur++;//指向astr的下一个
        if (*cur != '\0')
        {
            char* tmp = cur;
            while (*tmp != '\0')
            {
                //比较
                if (*tmp == *astr)
                    return false;
                tmp++;
            }
        }
        astr++;
    }
    return true;

}

         !!恭喜你完成第二天的修仙之旅!!

 

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值