数据结构与算法--字符匹配 & 字符去重

本文探讨了如何去除字符串中的重复字母并保持字典序最小,以及两种字符串匹配算法——BF算法和RK算法。BF算法逐字符比较,效率较低;而RK算法利用哈希值提高效率,通过字符转换为ASCII码值进行计算。
摘要由CSDN通过智能技术生成

1. 去除重复字母

  • 题目

    给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)

    示例1:
    输入:"bcabc"
    输出:"abc"
    
    示例2:
    输入:"cbacdcbc"
    输出:"acdb"
    
  • 题目分析

    题目的意思,你去除重复字母后,需要按最小的字典序返回.并且不能打乱其他字母的相对位置

    字典序:

    字符串之间比较和数字比较不一样,字符串比较是从头往后挨个字符比较,那个字符串大取决于两个字符串中第一个对应不相等的字符;

    例如: 
    任意一个 a 开头的字符串都大于任意一个 b 开头的字符串;
    例如字典中 apple 大于 book;
    
  • 思路

    1.判断字符串S是否为空,返回空,判断长度是否为1,直接返回S
    2.创建一个字符数组record,长度为26,来记录字符串中,每个字符出现的次数
    3.申请一个字符串栈stack,来记录去重后的字符,利用栈的特性,帮助我们找到正确的次序
    4.遍历字符串
    5.从0-top,遍历stack,判断当前字符是否存在stack中,定义一个标识isExist,记录当前字符是
      否存在栈中,0:不存在,1:存在
    6.如果当前字符存在在栈中,isExist = 1,record中对应字符位置上的出现次数减一,并继续遍历下一
      个字符; 表示当前的stack已经有这个字符了没有必要处理这个重复的字母;
    7.isExist = 0,表示当前字符不存在于栈中,需要找到正确的位置,入栈
      判断条件:栈非空 top>-1
              栈顶元素 > 当前字符
              栈顶元素,在以后字符中还会出现
      通过一个while循环找到将栈中位置错误的数据,出栈. 找当前合适的位置,则结束while循环;
    8.找到正确位置,当前字符入栈,
    9.拼接字符结束符\0
    
  • 代码

char *removeDuplicateLetters(char *s) {
    // ✅1.特殊情况判断
    if (s == NULL || strlen(s) == 0) {
        return "";
    }
    if (strlen(s) == 1) {
        return s;
    }
    
    // ✅2.创建一个字符数组record,长度为26
    char record[26] = {0};
    int len = (int)strlen(s);
    int i;
    // 统计每个字符的频次
    for (i = 0; i < len; i++) {
        record[s[i] - 'a'] ++;
    }
    
    // ✅3.申请一个字符串栈stack,来记录去重后的字符
    char* stack = (char*)malloc(sizeof(char) * len + 2);
    memset(stack, 0, sizeof(char) * len + 2);
    int top = -1;
    
    // ✅4.遍历字符串
    for (i = 0; i < len; i++) {
        // ✅定义一个标识isExist,记录当
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值